home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics Plus
/
Graphics Plus.iso
/
msdos
/
animutil
/
pcmovie
/
pcmovie.exe
next >
Wrap
Text File
|
1994-01-10
|
388KB
|
4,794 lines
//________ JOB
//*
//* APP3.GRAPHICS.PCMOVIE - 8Feb91/mrg
//* from CUSGJES.VIKTOR.SOURCE 8Feb91
//* Installs 77 rtnes in APP1.GRAPHICS.PCMOVIE
//*
//COMPILE EXEC FORTC,OPTIONS='VECTOR,DECK,NOOBJECT'
//SYSPUNCH DD DISP=(NEW,PASS),UNIT=VIO,DSN=&&OBJIN,
// SPACE=(TRK,(50,50),RLSE),DCB=OBJECT
//SYSIN DD *
C GRAPHICS LIBRARY FOR RASTER PLOTS
C WRITTEN FOR IBM 3090 VF - VIKTOR K. DECYK, UCLA
C COPYRIGHT 1990, REGENTS OF THE UNIVERSITY OF CALIFORNIA
C UPDATE: JANUARY 3, 1991
********************************************************************/
* */
* This subroutine library was created ad UCLA. */
* */
* The University of California requires the following disclaimer */
* concerning all distributed programs: */
* */
* Although this program material has been tested by its */
* contributor, no warranty, expressed or implied, is made by the */
* contributor or the University of California as to the accuracy */
* and functioning of the program and related program material, nor */
* shall the fact of the distribution constitute any such warranty, */
* and no responsibility is assumed by the contributor or the */
* University of California, in connection therewith. */
* */
********************************************************************/
*
*****************************************************
* GOPEN -- OPENS GRAPHICS LIBRARY
*****************************************************
*
SUBROUTINE GOPEN
C THIS SUBROUTINE OPENS GRAPHICS LIBRARY
COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE
IPLOT = 0
CALL STARTG
RETURN
END
*
*****************************************************
* gmopen -- initializes compressed raster device
* USE GMOPEN INSTEAD OF GOPEN FOR THE CONVERTING RASTER IMAGES TO MFE
*****************************************************
*
SUBROUTINE GMOPEN(IGTYPE,PAL,LPAL)
C THIS SUBROUTINE INITIALIZES COMPRESSED RASTER DEVICE
C FOR MFE FORMAT
C IGTYPE = (1,2,3) = (CGA,EGA,VGA) FORMAT
C PAL = 256 COLOR PALETTE IN RGB FORMAT
C LPAL = LENGTH OF PALETTE (LPAL = 0 MEANS USE DEFAULT PALETTE)
C DEFAULT IS VGA FORMAT
COMMON /GRDEV/ LX, LY, NBIT, IFRMT, INTRL, IXOR
common /dithpal/ pal64, npal64
CHARACTER*1 PAL( lpal*3 + 1 )
character*1 pal64( 768 )
CHARACTER*1 C
DIMENSION LXS(7), LYS(7), NBITS(4)
SAVE LXS,LYS,NBITS,ISTART
97 FORMAT (18H PROGRAM EXECUTING)
DATA LXS /512,640,320,640,720,79,1024/
DATA LYS /342,480,200,350,384,21,781/
DATA NBITS /1,2,4,8/
DATA ISTART /0/
IF (ISTART.NE.0) GO TO 90
npal64 = 0
INTRL = 0
IXOR = 1
NPAL = 1
IFRMT = 4
IXOR = 0
IF ((IGTYPE.LT.1).OR.(IGTYPE.GT.3)) IGTYPE = 3
ID = IGTYPE
IF (ID.EQ.1) then
NBIT = 2
INTRL = 1
else IF (ID.EQ.2) then
NBIT = 1
else
NBIT = 8
NPAL = 0
end if
IF (ID.LT.3) ID = ID + 2
LX = LXS(ID)
LY = LYS(ID)
CALL HEADER(IFRMT,LX,LY,NBIT)
if( lpal .ne. 0 ) then
do 71 ijes = 1, lpal*3
pal64( ijes ) = char( ichar( pal(ijes) ) / 4 )
71 continue
end if
npal64 = lpal
C write( 6,* ) ' npal = ', npal
IF (NPAL.EQ.0) then
C write( 6,* ) ' gmopen calling wrpal '
C write( 6,* ) ' ifrmt = ', ifrmt
CALL WRPAL( pal64, npal64, IFRMT )
end if
ISTART = 1
90 WRITE (6,97)
END
*
*****************************************************
* GRASP1 -- DISPLAYS (X-VX) PHASE SPACE
*****************************************************
*
SUBROUTINE GRASP1 (PART,LABEL,TIME,VMAX,NX,ITWO,NP,NPX,CI,IRC)
C FOR 1D CODE, THIS SUBROUTINE DISPLAYS (X-VX) PHASE SPACE
COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE
CHARACTER*20 LABEL
CHARACTER*12 LBLV, LBLU
CHARACTER*44 LBL
DIMENSION PART(ITWO,NP)
SAVE LW
91 FORMAT (1X,A20,16H PHASE SPACE, T=,F7.2)
DATA LBLV,LBLU /' VX VERSUS X',' UX VERSUS X'/
DATA LW /1/
IRC = 0
IF (NPLOT.LT.1) GO TO 70
C GET GRAPHICS SIZE PARAMETERS
CALL GRPARM(1,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY
1,NTCX,NTCY,IGSTYL)
C FIND SCALES FOR PLOT
XMIN = 0.
XMAX = FLOAT(NX)
YMIN = -VMAX
YMAX = VMAX
C FIND LOCATION FOR PLOT
NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001
NPL = NPL1 + 1
IY = IPLOT/NPL
IX = IPLOT - IY*NPL
MNX = (IX*IRX + MINX)/NPL
MNY = ((NPL1 - IY)*IRY + MINY)/NPL
LNX = LENX/NPL
LNY = LENY/NPL
JSTCX = ISTCX/NPL
JSTCY = ISTCY/NPL
JSLB = ISLB/NPL
JCH = ICH/NPL
IF (JCH.LT.1) JCH = 1
JCW = ICW/NPL
IF (JCW.LT.1) JCW = 1
IF (IPLOT.GT.0) GO TO 10
CALL INITGR(IRX,IRY,JCH,JCW)
GO TO 20
C DRAW GRID
10 CALL SELFMP(IRX,IRY)
20 IC = 7
CALL TICKS (XMAX,XMIN,YMAX,YMIN,MNX,MNY,LNX,LNY,JCH,JCW,JSLB,JSTCX
1,JSTCY,NTCX,NTCY,IC,LW,IGSTYL)
C WRITE LABELS
AT1 = FLOAT(JCH + JCH/3)
AX = FLOAT(MNX - JSLB)
AY = FLOAT(MNY - JSTCY) - 2.*AT1
IT1 = 44
WRITE (LBL,91) LABEL, TIME
CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)
IT1 = 12
AY = AY - AT1
IF (CI.EQ.0) CALL DRSTRG(LBLV,AX,AY,IC,LW,JCW,IT1)
IF (CI.GT.0) CALL DRSTRG(LBLU,AX,AY,IC,LW,JCW,IT1)
C PLOT GRAPH
CALL MAPWIN(XMIN,XMAX,YMIN,YMAX,MNX,LNX,MNY,LNY)
IT2 = 1
IF (NPX.EQ.0) GO TO 40
IC = 1
DO 30 J = 1, NPX
CALL DRPNTS(PART(1,J),PART(2,J),IT2,IC,LW)
30 CONTINUE
40 IF (NPX.GE.NP) GO TO 60
IC = 4
IT1 = NPX + 1
DO 50 J = IT1, NP
CALL DRPNTS(PART(1,J),PART(2,J),IT2,IC,LW)
50 CONTINUE
60 IPLOT = IPLOT + 1
IF (IPLOT.EQ.NPLOT) IPLOT = 0
IF (IPLOT.GT.0) GO TO 70
CALL SGRAPH
CALL READC(IRC)
70 RETURN
END
*
*****************************************************
* GRAF2 -- LINE PLOT OF Y VS X, FILLS MAX DISPLAY REGION
*****************************************************
*
SUBROUTINE GRAF2 (Y,LABELY,X,LABELX,N,CHR,NCR,IRC)
C THIS SUBROUTINE DOES A LINE PLOT OF Y VERSUS X, WHICH WILL FILL THE
C MAXIMUM ARE OF THE DISPLAY REGION
COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE
CHARACTER*20 LABELY, LABELX
CHARACTER*48 LBL
DIMENSION X(N), Y(N)
CHARACTER*(*) CHR
SAVE LW,EPS
91 FORMAT (A20,8H VERSUS ,A20)
DATA LW /1/
C DATA EPS /8.0E-14/
DATA EPS /0./
IRC = 0
IF (NPLOT.LT.1) GO TO 40
C GET GRAPHICS SIZE PARAMETERS
CALL GRPARM(1,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY
1,NTCX,NTCY,IGSTYL)
C FIND SCALES FOR PLOT
XMIN = X(1)
XMAX = XMIN
YMIN = Y(1)
YMAX = YMIN
DO 10 J = 1, N
IF (X(J).GT.XMAX) XMAX = X(J)
IF (X(J).LT.XMIN) XMIN = X(J)
IF (Y(J).GT.YMAX) YMAX = Y(J)
IF (Y(J).LT.YMIN) YMIN = Y(J)
10 CONTINUE
IF ((XMAX - XMIN).LE.EPS) XMAX = XMIN + 1.
IF ((YMAX - YMIN).LE.EPS) YMAX = YMIN + 1.
C FIND LOCATION FOR PLOT
NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001
NPL = NPL1 + 1
IY = IPLOT/NPL
IX = IPLOT - IY*NPL
MNX = (IX*IRX + MINX)/NPL
MNY = ((NPL1 - IY)*IRY + MINY)/NPL
LNX = LENX/NPL
LNY = LENY/NPL
JSTCX = ISTCX/NPL
JSTCY = ISTCY/NPL
JSLB = ISLB/NPL
JCH = ICH/NPL
IF (JCH.LT.1) JCH = 1
JCW = ICW/NPL
IF (JCW.LT.1) JCW = 1
IF (IPLOT.GT.0) GO TO 20
CALL INITGR(IRX,IRY,JCH,JCW)
GO TO 30
C DRAW GRID
20 CALL SELFMP(IRX,IRY)
30 IC = 7
CALL TICKS (XMAX,XMIN,YMAX,YMIN,MNX,MNY,LNX,LNY,JCH,JCW,JSLB,JSTCX
1,JSTCY,NTCX,NTCY,IC,LW,IGSTYL)
C WRITE LABELS
AT1 = FLOAT(JCH + JCH/3)
AX = FLOAT(MNX - JSLB)
AY = FLOAT(MNY - JSTCY) - 2.*AT1
IT1 = 48
WRITE (LBL,91) LABELY, LABELX
CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)
AY = AY - AT1
IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)
C PLOT CURVE
CALL MAPWIN(XMIN,XMAX,YMIN,YMAX,MNX,LNX,MNY,LNY)
IC = 1
CALL DRLINS (X,Y,N,IC,LW)
IPLOT = IPLOT + 1
IF (IPLOT.EQ.NPLOT) IPLOT = 0
IF (IPLOT.GT.0) GO TO 40
CALL SGRAPH
CALL READC(IRC)
40 RETURN
END
*
*****************************************************
* GRAF1 -- PLOT OF Y VS X WITH SPECIFIED DISPLAY REGION
*****************************************************
*
SUBROUTINE GRAF1(Y,LABELY,YMAX,YMIN,X,LABELX,XMAX,XMIN,N,CHR,NCR,I
1RC)
C THIS SUBROUTINE DOES A POINT PLOT OF Y VERSUS X, WITH THE MAXIMUM
C AND MINIMUM VALUES OF THE DISPLAY REGION GIVEN BY YMAX, YMIN, AND
C XMAX, XMIN, RESPECTIVELY.
COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE
CHARACTER*20 LABELY, LABELX
CHARACTER*48 LBL
DIMENSION X(N), Y(N)
CHARACTER*(*) CHR
SAVE LW,EPS
91 FORMAT (A20,8H VERSUS ,A20)
DATA LW /1/
C DATA EPS /8.0E-14/
DATA EPS /0./
IRC = 0
IF (NPLOT.LT.1) GO TO 30
C GET GRAPHICS SIZE PARAMETERS
CALL GRPARM(1,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY
1,NTCX,NTCY,IGSTYL)
IF ((XMAX - XMIN).LE.EPS) XMAX = XMIN + 1.
IF ((YMAX - YMIN).LE.EPS) YMAX = YMIN + 1.
C FIND LOCATION FOR PLOT
NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001
NPL = NPL1 + 1
IY = IPLOT/NPL
IX = IPLOT - IY*NPL
MNX = (IX*IRX + MINX)/NPL
MNY = ((NPL1 - IY)*IRY + MINY)/NPL
LNX = LENX/NPL
LNY = LENY/NPL
JSTCX = ISTCX/NPL
JSTCY = ISTCY/NPL
JSLB = ISLB/NPL
JCH = ICH/NPL
IF (JCH.LT.1) JCH = 1
JCW = ICW/NPL
IF (JCW.LT.1) JCW = 1
IF (IPLOT.GT.0) GO TO 10
CALL INITGR(IRX,IRY,JCH,JCW)
GO TO 20
C DRAW GRID
10 CALL SELFMP(IRX,IRY)
20 IC = 7
CALL TICKS (XMAX,XMIN,YMAX,YMIN,MNX,MNY,LNX,LNY,JCH,JCW,JSLB,JSTCX
1,JSTCY,NTCX,NTCY,IC,LW,IGSTYL)
C WRITE LABELS
AT1 = FLOAT(JCH + JCH/3)
AX = FLOAT(MNX - JSLB)
AY = FLOAT(MNY - JSTCY) - 2.*AT1
IT1 = 48
WRITE (LBL,91) LABELY, LABELX
CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)
AY = AY - AT1
IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)
C DRAW POINTS
CALL MAPWIN(XMIN,XMAX,YMIN,YMAX,MNX,LNX,MNY,LNY)
IC = 1
CALL DRPNTS (X,Y,N,IC,LW)
IPLOT = IPLOT + 1
IF (IPLOT.EQ.NPLOT) IPLOT = 0
IF (IPLOT.GT.0) GO TO 30
CALL SGRAPH
CALL READC(IRC)
30 RETURN
END
*
*****************************************************
* GRAF3 -- M LINE PLOTS OF Y VS X
*****************************************************
*
SUBROUTINE GRAF3 (Y,LABELY,X,LABELX,N,M,NV,CHR,NCR,IRC)
C THIS SUBROUTINE DOES M LINE PLOTS OF SUBARRAYS OF Y VERSUS X, EACH
C PLOT WITH N POINTS, ON A SCALE WHICH WILL FILL THE MAXIMUM AREA OF
C THE DISPLAY REGION. EACH SUBARRAY IS PLOTTED IN A DIFFERENT COLOR,
C WITH BLUE, RED, YELLOW, CYAN, MAGENTA, AND GREEN USED IN ORDER.
COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE
CHARACTER*20 LABELY, LABELX
CHARACTER*48 LBL
DIMENSION ICOLOR(8)
DIMENSION X(N), Y(NV,M)
CHARACTER*(*) CHR
SAVE LW,EPS,ICOLOR
91 FORMAT (A20,8H VERSUS ,A20)
DATA LW /1/
C DATA EPS /8.0E-14/
DATA EPS /0./
C COLORS ARE: BACKGROUND,BLUE,RED,YELLOW,CYAN,MAGENTA,GREEN,FOREGROUND
DATA ICOLOR /0,1,4,6,3,5,2,7/
IRC = 0
IF (NPLOT.LT.1) GO TO 60
C GET GRAPHICS SIZE PARAMETERS
CALL GRPARM(1,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY
1,NTCX,NTCY,IGSTYL)
C FIND SCALES FOR PLOT
XMIN = X(1)
XMAX = XMIN
YMIN = Y(1,1)
YMAX = YMIN
DO 20 J = 1, N
IF (X(J).GT.XMAX) XMAX = X(J)
IF (X(J).LT.XMIN) XMIN = X(J)
DO 10 K = 1, M
IF (Y(J,K).GT.YMAX) YMAX = Y(J,K)
IF (Y(J,K).LT.YMIN) YMIN = Y(J,K)
10 CONTINUE
20 CONTINUE
IF ((XMAX - XMIN).LE.EPS) XMAX = XMIN + 1.
IF ((YMAX - YMIN).LE.EPS) YMAX = YMIN + 1.
C FIND LOCATION FOR PLOT
NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001
NPL = NPL1 + 1
IY = IPLOT/NPL
IX = IPLOT - IY*NPL
MNX = (IX*IRX + MINX)/NPL
MNY = ((NPL1 - IY)*IRY + MINY)/NPL
LNX = LENX/NPL
LNY = LENY/NPL
JSTCX = ISTCX/NPL
JSTCY = ISTCY/NPL
JSLB = ISLB/NPL
JCH = ICH/NPL
IF (JCH.LT.1) JCH = 1
JCW = ICW/NPL
IF (JCW.LT.1) JCW = 1
IF (IPLOT.GT.0) GO TO 30
CALL INITGR(IRX,IRY,JCH,JCW)
GO TO 40
C DRAW GRID
30 CALL SELFMP(IRX,IRY)
40 IC = 7
CALL TICKS (XMAX,XMIN,YMAX,YMIN,MNX,MNY,LNX,LNY,JCH,JCW,JSLB,JSTCX
1,JSTCY,NTCX,NTCY,IC,LW,IGSTYL)
C WRITE LABELS
AT1 = FLOAT(JCH + JCH/3)
AX = FLOAT(MNX - JSLB)
AY = FLOAT(MNY - JSTCY) - 2.*AT1
IT1 = 48
WRITE (LBL,91) LABELY, LABELX
CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)
AY = AY - AT1
IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)
C PLOT CURVES
CALL MAPWIN(XMIN,XMAX,YMIN,YMAX,MNX,LNX,MNY,LNY)
DO 50 K = 1, M
IT1 = (K - 1)/7
IC = K - 7*IT1
CALL DRLINS (X,Y(1,K),N,ICOLOR(IC+1),LW)
50 CONTINUE
IPLOT = IPLOT + 1
IF (IPLOT.EQ.NPLOT) IPLOT = 0
IF (IPLOT.GT.0) GO TO 60
CALL SGRAPH
CALL READC(IRC)
60 RETURN
END
*
*****************************************************
* DISP -- PLOTS M SUBARRAYS USING A COMMON SCALE
*****************************************************
*
SUBROUTINE DISP (F,LABEL,XMIN,XMAX,N,M,NV,ISC,CHR,NCR,IRC)
C THIS SUBROUTINE DISPLAYS M SUBARRAYS OF THE ARRAY F, EACH PLOT WITH N
C POINTS, ON A COMMON SCALE GIVEN BY YMAX = 2**ISC, YMIN = -2**ISC,
C VERSUS A LINEAR FUNCTION IN X, WHERE XMIN < X < XMAX. IF ABS(ISC) >
C 116, THEN THE PROGRAM FINDS THE MINIMUM VALUE OF ISC WHICH WILL CON-
C TAIN THE PLOTS. EACH SUBARRAY IS PLOTTED IN A DIFFERENT COLOR,
C WITH BLUE, RED, YELLOW, CYAN, MAGENTA, AND GREEN USED IN ORDER.
COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE
CHARACTER*20 LABEL
CHARACTER*36 LBL
DIMENSION F(NV,M)
CHARACTER*(*) CHR
DIMENSION ICOLOR(8)
DIMENSION X(2)
SAVE LW,DV,ICOLOR
91 FORMAT (A20,8H, SCALE=,I8)
DATA LW /1/
DATA DV /2./
C COLORS ARE: BACKGROUND,BLUE,RED,YELLOW,CYAN,MAGENTA,GREEN,FOREGROUND
DATA ICOLOR /0,1,4,6,3,5,2,7/
IRC = 0
IF (NPLOT.LT.1) GO TO 90
C GET GRAPHICS SIZE PARAMETERS
CALL GRPARM(1,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY
1,NTCX,NTCY,IGSTYL)
C FIND SCALES FOR PLOT
IS = ISC
IF (IABS(IS).LE.116) GO TO 30
FMAX = ABS(F(1,1))
DO 20 J = 1, M
DO 10 I = 1, N
AT1 = ABS(F(I,J))
IF (AT1.GT.FMAX) FMAX = AT1
10 CONTINUE
20 CONTINUE
IF (FMAX.EQ.0.) FMAX = 1.0E-35
IS = ALOG(FMAX)/ALOG(DV)
IF (FMAX.GE.1.) IS = IS + 1
30 YMAX = DV**IS
YMIN = -YMAX
C FIND LOCATION FOR PLOT
NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001
NPL = NPL1 + 1
IY = IPLOT/NPL
IX = IPLOT - IY*NPL
MNX = (IX*IRX + MINX)/NPL
MNY = ((NPL1 - IY)*IRY + MINY)/NPL
LNX = LENX/NPL
LNY = LENY/NPL
JSTCX = ISTCX/NPL
JSTCY = ISTCY/NPL
JSLB = ISLB/NPL
JCH = ICH/NPL
IF (JCH.LT.1) JCH = 1
JCW = ICW/NPL
IF (JCW.LT.1) JCW = 1
IF (IPLOT.GT.0) GO TO 40
CALL INITGR(IRX,IRY,JCH,JCW)
GO TO 50
C DRAW GRID
40 CALL SELFMP(IRX,IRY)
50 IC = 7
CALL TICKS (XMAX,XMIN,YMAX,YMIN,MNX,MNY,LNX,LNY,JCH,JCW,JSLB,JSTCX
1,JSTCY,NTCX,NTCY,IC,LW,IGSTYL)
C WRITE LABELS
AT1 = FLOAT(JCH + JCH/3)
AX = FLOAT(MNX - JSLB)
AY = FLOAT(MNY - JSTCY) - 2.*AT1
IT1 = 36
WRITE (LBL,91) LABEL, IS
CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)
AY = AY - AT1
IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)
C DRAW CURVES
CALL MAPWIN(XMIN,XMAX,YMIN,YMAX,MNX,LNX,MNY,LNY)
IF (N.LT.2) GO TO 80
IT2 = 2
N1 = N - 1
DX = (XMAX - XMIN)/FLOAT(N1)
DO 70 K = 1, M
IT1 = (K - 1)/7
IC = K - 7*IT1
IT3 = ICOLOR(IC+1)
X(2) = XMIN
DO 60 I = 1, N1
X(1) = X(2)
X(2) = XMIN + DX*FLOAT(I)
CALL DRLINS (X,F(I,K),IT2,IT3,LW)
60 CONTINUE
70 CONTINUE
80 IPLOT = IPLOT + 1
IF (IPLOT.EQ.NPLOT) IPLOT = 0
IF (IPLOT.GT.0) GO TO 90
CALL SGRAPH
CALL READC(IRC)
90 RETURN
END
*
*****************************************************
* DISP1 -- DISPLAYS M SUBARRAYS OF ARRAY F
*****************************************************
*
SUBROUTINE DISP1 (F,LABEL,XMIN,XMAX,N,M,NV,ISC,IST,CHR,NCR,IRC)
C THIS SUBROUTINE DISPLAYS M SUBARRAYS OF THE ARRAY F, EACH PLOT WITH N
C POINTS, VERSUS A LINEAR FUNCTION IN X, WHERE XMIN < X < XMAX.
C THE PLOTS HAVE A COMMON SCALE IN Y GIVEN BY YMAX AND YMIN.
C IF IST = 0, THEN YMAX = 2**ISC AND YMIN = -2**ISC.
C IF IST > 0, THEN YMAX = 2**ISC AND YMIN = 0.
C IF IST < 0, THEN YMAX = 0 AND YMIN = -2**ISC.
C IF ABS(ISC) > 116, THEN THE PROGRAM FINDS THE MINIMUM VALUE OF ISC
C WHICH WILL CONTAIN THE PLOTS. EACH SUBARRAY IS PLOTTED IN A DIFFERENT
C COLOR, WITH BLUE, RED, YELLOW, CYAN, MAGENTA, AND GREEN USED IN ORDER.
COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE
CHARACTER*20 LABEL
CHARACTER*36 LBL
DIMENSION F(NV,M)
CHARACTER*(*) CHR
DIMENSION ICOLOR(8)
DIMENSION X(2)
SAVE LW,DV,ICOLOR
91 FORMAT (A20,8H, SCALE=,I8)
DATA LW /1/
DATA DV /2./
C COLORS ARE: BACKGROUND,BLUE,RED,YELLOW,CYAN,MAGENTA,GREEN,FOREGROUND
DATA ICOLOR /0,1,4,6,3,5,2,7/
IRC = 0
IF (NPLOT.LT.1) GO TO 90
C GET GRAPHICS SIZE PARAMETERS
CALL GRPARM(1,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY
1,NTCX,NTCY,IGSTYL)
C FIND SCALES FOR PLOT
IS = ISC
IF (IABS(IS).LE.116) GO TO 30
FMAX = ABS(F(1,1))
DO 20 J = 1, M
DO 10 I = 1, N
AT1 = ABS(F(I,J))
IF (AT1.GT.FMAX) FMAX = AT1
10 CONTINUE
20 CONTINUE
IF (FMAX.EQ.0.) FMAX = 1.0E-35
IS = ALOG(FMAX)/ALOG(DV)
IF (FMAX.GE.1.) IS = IS + 1
30 YMAX = DV**IS
YMIN = -YMAX
IF (IST.GT.0) YMIN = 0.
IF (IST.LT.0) YMAX = 0.
C FIND LOCATION FOR PLOT
NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001
NPL = NPL1 + 1
IY = IPLOT/NPL
IX = IPLOT - IY*NPL
MNX = (IX*IRX + MINX)/NPL
MNY = ((NPL1 - IY)*IRY + MINY)/NPL
LNX = LENX/NPL
LNY = LENY/NPL
JSTCX = ISTCX/NPL
JSTCY = ISTCY/NPL
JSLB = ISLB/NPL
JCH = ICH/NPL
IF (JCH.LT.1) JCH = 1
JCW = ICW/NPL
IF (JCW.LT.1) JCW = 1
IF (IPLOT.GT.0) GO TO 40
CALL INITGR(IRX,IRY,JCH,JCW)
GO TO 50
C DRAW GRID
40 CALL SELFMP(IRX,IRY)
50 IC = 7
CALL TICKS (XMAX,XMIN,YMAX,YMIN,MNX,MNY,LNX,LNY,JCH,JCW,JSLB,JSTCX
1,JSTCY,NTCX,NTCY,IC,LW,IGSTYL)
C WRITE LABELS
AT1 = FLOAT(JCH + JCH/3)
AX = FLOAT(MNX - JSLB)
AY = FLOAT(MNY - JSTCY) - 2.*AT1
IT1 = 36
WRITE (LBL,91) LABEL, IS
CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)
AY = AY - AT1
IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)
C DRAW CURVES
CALL MAPWIN(XMIN,XMAX,YMIN,YMAX,MNX,LNX,MNY,LNY)
IF (N.LT.2) GO TO 80
IT2 = 2
N1 = N - 1
DX = (XMAX - XMIN)/FLOAT(N1)
DO 70 K = 1, M
IT1 = (K - 1)/7
IC = K - 7*IT1
IT3 = ICOLOR(IC+1)
X(2) = XMIN
DO 60 I = 1, N1
X(1) = X(2)
X(2) = XMIN + DX*FLOAT(I)
CALL DRLINS (X,F(I,K),IT2,IT3,LW)
60 CONTINUE
70 CONTINUE
80 IPLOT = IPLOT + 1
IF (IPLOT.EQ.NPLOT) IPLOT = 0
IF (IPLOT.GT.0) GO TO 90
CALL SGRAPH
CALL READC(IRC)
90 RETURN
END
*
*****************************************************
* DISP2 -- PLOTS TWO SUBARRAYS OF F
*****************************************************
*
SUBROUTINE DISP2 (F,LABEL,XV,XMIN,XMAX,N,M,NV,ISC,CHR,NCR,IRC)
C THIS SUBROUTINE DISPLAYS TWO SUBARRAYS OF THE ARRAY F, BOTH PLOTS WITH
C N POINTS, ON A COMMON SCALE GIVEN BY YMAX = 2**ISC, YMIN =-2**ISC,
C VERSUS A LINEAR FUNCTION IN X, WHERE XMIN < X < XMAX.
C IF ABS(ISC) > 116, THEN THE PROGRAM FINDS THE MINIMUM VALUE OF ISC
C WHICH WILL CONTAIN THE PLOTS. THE FIRST SUBARRAY IS DRAWN AS A LINE
C PLOT, AND THE SECOND AS SMALL CLOSED CIRCLES. IN ADDITION, A VERTICAL
C LINE AT LOCATION X = XV IS DRAWN. THE FIRST SUBARRAY IS PLOTTED IN
C BLUE AND THE SECOND IN RED.
COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE
CHARACTER*1 CHS
CHARACTER*20 LABEL
CHARACTER*36 LBL
DIMENSION F(NV,M)
CHARACTER*(*) CHR
DIMENSION X(2), Y(2)
SAVE LW,DV,CHS
91 FORMAT (A20,8H, SCALE=,I8)
DATA LW /1/
DATA DV /2./
DATA CHS /'o'/
IRC = 0
IF (NPLOT.LT.1) GO TO 90
C GET GRAPHICS SIZE PARAMETERS
CALL GRPARM(1,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY
1,NTCX,NTCY,IGSTYL)
C FIND SCALES FOR PLOT
IS = ISC
IF (IABS(IS).LE.116) GO TO 30
FMAX = ABS(F(1,1))
DO 20 J = 1, M
DO 10 I = 1, N
AT1 = ABS(F(I,J))
IF (AT1.GT.FMAX) FMAX = AT1
10 CONTINUE
20 CONTINUE
IF (FMAX.EQ.0.) FMAX = 1.0E-35
IS = ALOG(FMAX)/ALOG(DV)
IF (FMAX.GE.1.) IS = IS + 1
30 YMAX = DV**IS
YMIN = -YMAX
C FIND LOCATION FOR PLOT
NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001
NPL = NPL1 + 1
IY = IPLOT/NPL
IX = IPLOT - IY*NPL
MNX = (IX*IRX + MINX)/NPL
MNY = ((NPL1 - IY)*IRY + MINY)/NPL
LNX = LENX/NPL
LNY = LENY/NPL
JSTCX = ISTCX/NPL
JSTCY = ISTCY/NPL
JSLB = ISLB/NPL
JCH = ICH/NPL
IF (JCH.LT.1) JCH = 1
JCW = ICW/NPL
IF (JCW.LT.1) JCW = 1
IF (IPLOT.GT.0) GO TO 40
CALL INITGR(IRX,IRY,JCH,JCW)
GO TO 50
C DRAW GRID
40 CALL SELFMP(IRX,IRY)
50 IC = 7
CALL TICKS (XMAX,XMIN,YMAX,YMIN,MNX,MNY,LNX,LNY,JCH,JCW,JSLB,JSTCX
1,JSTCY,NTCX,NTCY,IC,LW,IGSTYL)
C WRITE LABELS
AT1 = FLOAT(JCH + JCH/3)
AX = FLOAT(MNX - JSLB)
AY = FLOAT(MNY - JSTCY) - 2.*AT1
IT1 = 36
WRITE (LBL,91) LABEL, IS
CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)
AY = AY - AT1
IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)
CALL MAPWIN(XMIN,XMAX,YMIN,YMAX,MNX,LNX,MNY,LNY)
C SPECIAL CASE OF VERTICAL LINE
X(1) = XV
Y(1) = YMIN
X(2) = XV
Y(2) = YMAX
CALL DRLINS (X,Y,2,IC,LW)
C MULTIPLE CURVES
IF (N.LT.2) GO TO 80
IT1 = 2
N1 = N - 1
DX = (XMAX - XMIN)/FLOAT(N1)
C FIRST CURVE IS SOLID LINE
IC = 1
X(2) = XMIN
DO 60 I = 1, N1
X(1) = X(2)
X(2) = XMIN + DX*FLOAT(I)
CALL DRLINS (X,F(I,1),IT1,IC,LW)
60 CONTINUE
C SECOND CURVE IS POINTS
IF (M.EQ.1) GO TO 80
IC = 4
IT1 = 1
DXH = .3*FLOAT(JCW)*(XMAX - XMIN)/FLOAT(LNX)
DYH = .25*FLOAT(JCH)*(YMAX - YMIN)/FLOAT(LNY)
DO 70 I = 1, N
AX = XMIN + DX*FLOAT(I - 1) - DXH
AY = F(I,2) - DYH
CALL DRSTRG(CHS,AX,AY,IC,LW,JCW,IT1)
70 CONTINUE
80 IPLOT = IPLOT + 1
IF (IPLOT.EQ.NPLOT) IPLOT = 0
IF (IPLOT.GT.0) GO TO 90
CALL SGRAPH
CALL READC(IRC)
90 RETURN
END
*
*****************************************************
* CONTUR -- CONTOUR PLOT OF FUNCTION F
*****************************************************
*
SUBROUTINE CONTUR (F,LINK,LABEL,NX,NY,NC,NXV,CHR,NCR,IRC)
C CONTUR DOES A CONTOUR PLOT OF THE FUNCTION F, FOR VALUES OF THE FIRST
C INDEX IN THE RANGE 1 < I < N, AND OF THE SECOND INDEX 1 < J < M. NC
C CONTOUR INTERVALS ARE CHOSEN, SPACED EQUALLY BETWEEN THE MAXIMUM AND
C MINIMUM VALUES OF F. SEVEN COLORS ARE USED TO PLOT THE CONTOURS.
C RED, MAGENTA, YELLOW, FOREGROUND, CYAN, GREEN, AND BLUE ARE USED IN
C GOING FROM HIGHEST TO LOWEST VALUES.
C ISTYLE = (0,1) = CONTOUR PLOT (FILLS AREA,PRESERVES ASPECT RATIO)
COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE
LOGICAL*1 LINK(2,NX,NY)
CHARACTER*20 LABEL
CHARACTER*57 LBL
DIMENSION F(NXV,NY)
CHARACTER*(*) CHR
DIMENSION X(2), Y(2), C(2)
91 FORMAT (A20,5H MAX=,E10.3,5H MIN=,E10.3,4H NC=,I3)
SAVE LW,ISTYLE,ZERO,ONE
DATA LW,ISTYLE /1,1/
DATA ZERO,ONE /0.,1./
IRC = 0
IF (NPLOT.LT.1) GO TO 70
ANX = FLOAT(NX)
ANY = FLOAT(NY)
C GET GRAPHICS SIZE PARAMETERS
CALL GRPARM(2,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY
1,NTCX,NTCY,IGSTYL)
C FIND SCALES FOR PLOT
FMIN = F(1,1)
FMAX = FMIN
DO 20 K = 1, NY
DO 10 J = 1, NX
IF (F(J,K).GT.FMAX) FMAX = F(J,K)
IF (F(J,K).LT.FMIN) FMIN = F(J,K)
10 CONTINUE
20 CONTINUE
C FIND LOCATION FOR PLOT
NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001
NPL = NPL1 + 1
IY = IPLOT/NPL
IX = IPLOT - IY*NPL
MNX = (IX*IRX + MINX)/NPL
MNY = ((NPL1 - IY)*IRY + MINY)/NPL
LNX = LENX/NPL
LNY = LENY/NPL
JSLB = ISLB/NPL
JCH = ICH/NPL
IF (JCH.LT.1) JCH = 1
JCW = ICW/NPL
IF (JCW.LT.1) JCW = 1
IF (IPLOT.GT.0) GO TO 30
CALL INITGR(IRX,IRY,JCH,JCW)
GO TO 40
C DRAW GRID
30 CALL SELFMP(IRX,IRY)
40 IC = 7
MNX0 = MNX
MNY0 = MNY
IF (ISTYLE.EQ.0) GO TO 50
MXX = MNX + LNX
MXY = MNY + LNY
IF (NY.GT.NX) LNX = FLOAT(LNX)*(ANX/ANY) + .5
IF (NX.GT.NY) LNY = FLOAT(LNY)*(ANY/ANX) + .5
MNX = MXX - LNX
MNY = MXY - LNY
C DRAW BOX
50 CALL BOX (MNX,MNY,LNX,LNY,JCH,JCW,IC,LW,IGSTYL)
C WRITE LABELS
AT1 = FLOAT(JCH + JCH/3)
AX = FLOAT(MNX0 - JSLB)
AY = FLOAT(MNY0) - AT1
IT1 = 57
WRITE (LBL,91) LABEL, FMAX, FMIN, NC
CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)
AY = AY - AT1
IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)
C DRAW CONTOURS
IF (FMAX.EQ.FMIN) GO TO 60
CALL MAPWIN(ZERO,ANX,ZERO,ANY,MNX,LNX,MNY,LNY)
C FIX STARTING VALUE AND INCREMENT FOR SPATIAL COORDINATES
X(1) = ZERO
Y(1) = ZERO
X(2) = ONE
Y(2) = ONE
C FIX FIRST CONTOUR LEVEL AND CONTOUR INTERVAL
C(2) = (FMAX - FMIN)/FLOAT(NC)
C(1) = FMIN + .5*C(2)
CALL CONTRU (X,Y,F,C,NX,NY,NC,LINK,NXV,LW)
60 IPLOT = IPLOT + 1
IF (IPLOT.EQ.NPLOT) IPLOT = 0
IF (IPLOT.GT.0) GO TO 70
CALL SGRAPH
CALL READC(IRC)
70 RETURN
END
*
*****************************************************
* DISPCN -- CONTOUR PLOT OF FUNCTION F
*****************************************************
*
SUBROUTINE DISPCN (F,LINK,LABEL,NX,NY,NC,NXV,ISC,CHR,NCR,IRC)
C DISPCN DOES A CONTOUR PLOT OF THE FUNCTION F, FOR VALUES OF THE FIRST
C INDEX IN THE RANGE 1 < I < N, AND OF THE SECOND INDEX 1 < J < M. NC
C CONTOUR INTERVALS ARE CHOSEN, SPACED EQUALLY BETWEEN FMAX = 2**ISC AND
C FMIN = -2**ISC. IF ABS(ISC) > 116, THEN THE PROGRAM FINDS THE MINIMUM
C VALUE OF ISC WHICH WILL CONTAIN THE FUNCTION VALUES. SEVEN COLORS ARE
C USED TO PLOT THE CONTOURS. RED, MAGENTA, YELLOW, FOREGROUND, CYAN,
C GREEN, AND BLUE ARE USED IN GOING FROM HIGHEST TO LOWEST VALUES.
C ISTYLE = (0,1) = CONTOUR PLOT (FILLS AREA,PRESERVES ASPECT RATIO)
COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE
LOGICAL*1 LINK(2,NX,NY)
CHARACTER*20 LABEL
CHARACTER*40 LBL
DIMENSION F(NXV,NY)
CHARACTER*(*) CHR
DIMENSION X(2), Y(2), C(2)
91 FORMAT (A20,8H, SCALE=,I5,4H NC=,I3)
SAVE LW,ISTYLE,DV,ZERO,ONE
DATA LW,ISTYLE /1,1/
DATA DV /2./
DATA ZERO,ONE /0.,1./
IRC = 0
IF (NPLOT.LT.1) GO TO 70
ANX = FLOAT(NX)
ANY = FLOAT(NY)
C GET GRAPHICS SIZE PARAMETERS
CALL GRPARM(2,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY
1,NTCX,NTCY,IGSTYL)
C FIND SCALES FOR PLOT
IS = ISC
IF (IABS(IS).LE.116) GO TO 30
FMAX = ABS(F(1,1))
DO 20 K = 1, NY
DO 10 J = 1, NX
AT1 = ABS(F(J,K))
IF (AT1.GT.FMAX) FMAX = AT1
10 CONTINUE
20 CONTINUE
IF (FMAX.EQ.0.) FMAX = 1.0E-35
IS = ALOG(FMAX)/ALOG(DV)
IF (FMAX.GE.1.) IS = IS + 1
30 FMAX = DV**IS
FMIN = -FMAX
C FIND LOCATION FOR PLOT
NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001
NPL = NPL1 + 1
IY = IPLOT/NPL
IX = IPLOT - IY*NPL
MNX = (IX*IRX + MINX)/NPL
MNY = ((NPL1 - IY)*IRY + MINY)/NPL
LNX = LENX/NPL
LNY = LENY/NPL
JSLB = ISLB/NPL
JCH = ICH/NPL
IF (JCH.LT.1) JCH = 1
JCW = ICW/NPL
IF (JCW.LT.1) JCW = 1
IF (IPLOT.GT.0) GO TO 40
CALL INITGR(IRX,IRY,JCH,JCW)
GO TO 50
C DRAW GRID
40 CALL SELFMP(IRX,IRY)
50 IC = 7
MNX0 = MNX
MNY0 = MNY
IF (ISTYLE.EQ.0) GO TO 60
MXX = MNX + LNX
MXY = MNY + LNY
IF (NY.GT.NX) LNX = FLOAT(LNX)*(ANX/ANY) + .5
IF (NX.GT.NY) LNY = FLOAT(LNY)*(ANY/ANX) + .5
MNX = MXX - LNX
MNY = MXY - LNY
C DRAW BOX
60 CALL BOX (MNX,MNY,LNX,LNY,JCH,JCW,IC,LW,IGSTYL)
C WRITE LABELS
AT1 = FLOAT(JCH + JCH/3)
AX = FLOAT(MNX0 - JSLB)
AY = FLOAT(MNY0) - AT1
IT1 = 40
WRITE (LBL,91) LABEL, IS, NC
CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)
AY = AY - AT1
IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)
C DRAW CONTOURS
CALL MAPWIN(ZERO,ANX,ZERO,ANY,MNX,LNX,MNY,LNY)
C FIX STARTING VALUE AND INCREMENT FOR SPATIAL COORDINATES
X(1) = ZERO
Y(1) = ZERO
X(2) = ONE
Y(2) = ONE
C FIX FIRST CONTOUR LEVEL AND CONTOUR INTERVAL
C(2) = (FMAX - FMIN)/FLOAT(NC)
C(1) = FMIN + .5*C(2)
CALL CONTRU (X,Y,F,C,NX,NY,NC,LINK,NXV,LW)
IPLOT = IPLOT + 1
IF (IPLOT.EQ.NPLOT) IPLOT = 0
IF (IPLOT.GT.0) GO TO 70
CALL SGRAPH
CALL READC(IRC)
70 RETURN
END
*
*****************************************************
* DSPCN2 -- CONTOUR PLOT OF FUNCTION F
*****************************************************
*
SUBROUTINE DSPCN2 (F,LINK,LABEL,XV,YV,NX,NY,NC,NXV,ISC,CHR,NCR,IRC
1)
C DSPCN2 DOES A CONTOUR PLOT OF THE FUNCTION F, FOR VALUES OF THE FIRST
C INDEX IN THE RANGE 1 < I < N, AND OF THE SECOND INDEX 1 < J < M. NC
C CONTOUR INTERVALS ARE CHOSEN, SPACED EQUALLY BETWEEN FMAX = 2**ISC AND
C FMIN = -2**ISC. IF ABS(ISC) > 116, THEN THE PROGRAM FINDS THE MINIMUM
C VALUE OF ISC WHICH WILL CONTAIN THE FUNCTION VALUES. IN ADDITION, A
C PAIR OF VERTICAL AND HORIZONTAL LINES ARE DRAWN AT X = XV AND Y = YV,
C WHERE THE UNITS ARE 0 < X < N AND 0 < Y < M. SEVEN COLORS ARE USED TO
C PLOT THE CONTOURS. RED, MAGENTA, YELLOW, FOREGROUND, CYAN, GREEN, AND
C BLUE ARE USED IN GOING FROM HIGHEST TO LOWEST VALUES.
C ISTYLE = (0,1) = CONTOUR PLOT (FILLS AREA,PRESERVES ASPECT RATIO)
COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE
LOGICAL*1 LINK(2,NX,NY)
CHARACTER*20 LABEL
CHARACTER*40 LBL
DIMENSION F(NXV,NY)
CHARACTER*(*) CHR
DIMENSION X(2), Y(2), C(2)
91 FORMAT (A20,8H, SCALE=,I5,4H NC=,I3)
SAVE LW,ISTYLE,DV,ZERO,ONE
DATA LW,ISTYLE /1,1/
DATA DV /2./
DATA ZERO,ONE /0.,1./
IRC = 0
IF (NPLOT.LT.1) GO TO 70
ANX = FLOAT(NX)
ANY = FLOAT(NY)
C GET GRAPHICS SIZE PARAMETERS
CALL GRPARM(2,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY
1,NTCX,NTCY,IGSTYL)
C FIND SCALES FOR PLOT
IS = ISC
IF (IABS(IS).LE.116) GO TO 30
FMAX = ABS(F(1,1))
DO 20 K = 1, NY
DO 10 J = 1, NX
AT1 = ABS(F(J,K))
IF (AT1.GT.FMAX) FMAX = AT1
10 CONTINUE
20 CONTINUE
IF (FMAX.EQ.0.) FMAX = 1.0E-35
IS = ALOG(FMAX)/ALOG(DV)
IF (FMAX.GE.1.) IS = IS + 1
30 FMAX = DV**IS
FMIN = -FMAX
C FIND LOCATION FOR PLOT
NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001
NPL = NPL1 + 1
IY = IPLOT/NPL
IX = IPLOT - IY*NPL
MNX = (IX*IRX + MINX)/NPL
MNY = ((NPL1 - IY)*IRY + MINY)/NPL
LNX = LENX/NPL
LNY = LENY/NPL
JSLB = ISLB/NPL
JCH = ICH/NPL
IF (JCH.LT.1) JCH = 1
JCW = ICW/NPL
IF (JCW.LT.1) JCW = 1
IF (IPLOT.GT.0) GO TO 40
CALL INITGR(IRX,IRY,JCH,JCW)
GO TO 50
C DRAW GRID
40 CALL SELFMP(IRX,IRY)
50 IC = 7
MNX0 = MNX
MNY0 = MNY
IF (ISTYLE.EQ.0) GO TO 60
MXX = MNX + LNX
MXY = MNY + LNY
IF (NY.GT.NX) LNX = FLOAT(LNX)*(ANX/ANY) + .5
IF (NX.GT.NY) LNY = FLOAT(LNY)*(ANY/ANX) + .5
MNX = MXX - LNX
MNY = MXY - LNY
C DRAW BOX
60 CALL BOX (MNX,MNY,LNX,LNY,JCH,JCW,IC,LW,IGSTYL)
C WRITE LABELS
AT1 = FLOAT(JCH + JCH/3)
AX = FLOAT(MNX0 - JSLB)
AY = FLOAT(MNY0) - AT1
IT1 = 40
WRITE (LBL,91) LABEL, IS, NC
CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)
AY = AY - AT1
IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)
CALL MAPWIN(ZERO,ANX,ZERO,ANY,MNX,LNX,MNY,LNY)
C SPECIAL CASE OF VERTICAL AND HORIZONTAL LINES
X(1) = XV
Y(1) = ZERO
X(2) = XV
Y(2) = ANY
CALL DRLINS (X,Y,2,IC,LW)
X(1) = ZERO
Y(1) = YV
X(2) = ANX
Y(2) = YV
CALL DRLINS (X,Y,2,IC,LW)
C DRAW CONTOURS
C FIX STARTING VALUE AND INCREMENT FOR SPATIAL COORDINATES
X(1) = ZERO
Y(1) = ZERO
X(2) = ONE
Y(2) = ONE
C FIX FIRST CONTOUR LEVEL AND CONTOUR INTERVAL
C(2) = (FMAX - FMIN)/FLOAT(NC)
C(1) = FMIN + .5*C(2)
CALL CONTRU (X,Y,F,C,NX,NY,NC,LINK,NXV,LW)
IPLOT = IPLOT + 1
IF (IPLOT.EQ.NPLOT) IPLOT = 0
IF (IPLOT.GT.0) GO TO 70
CALL SGRAPH
CALL READC(IRC)
70 RETURN
END
*
*****************************************************
* RASTUR -- COLOR RASTER IMAGE OF FUNCTION F
*****************************************************
*
SUBROUTINE RASTUR (F,LABEL,NX,NY,NXV,CHR,NCR,IRC)
C RASTUR DOES A COLOR RASTER IMAGE OF THE FUNCTION F, FOR VALUES OF THE
C FIRST INDEX IN THE RANGE 1 < I < N, AND OF THE SECOND INDEX 1 < J < M.
C SEVEN COLORS ARE USED. RED, MAGENTA, YELLOW, FOREGROUND, CYAN, GREEN,
C AND BLUE ARE USED IN GOING FROM HIGHEST TO LOWEST VALUES
C ISTYLE = (0,1) = CONTOUR PLOT (FILLS AREA,PRESERVES ASPECT RATIO)
COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE
CHARACTER*20 LABEL
CHARACTER*50 LBL
DIMENSION F(NXV,NY)
CHARACTER*(*) CHR
91 FORMAT (A20,5H MAX=,E10.3,5H MIN=,E10.3)
SAVE LW,ISTYLE,ZERO
DATA LW,ISTYLE /1,1/
DATA ZERO /0./
IRC = 0
IF (NPLOT.LT.1) GO TO 70
ANX = FLOAT(NX)
ANY = FLOAT(NY)
C GET GRAPHICS SIZE PARAMETERS
CALL GRPARM(2,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY
1,NTCX,NTCY,IGSTYL)
C FIND SCALES FOR PLOT
FMIN = F(1,1)
FMAX = FMIN
DO 20 K = 1, NY
DO 10 J = 1, NX
IF (F(J,K).GT.FMAX) FMAX = F(J,K)
IF (F(J,K).LT.FMIN) FMIN = F(J,K)
10 CONTINUE
20 CONTINUE
C FIND LOCATION FOR PLOT
NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001
NPL = NPL1 + 1
IY = IPLOT/NPL
IX = IPLOT - IY*NPL
MNX = (IX*IRX + MINX)/NPL
MNY = ((NPL1 - IY)*IRY + MINY)/NPL
LNX = LENX/NPL
LNY = LENY/NPL
JSLB = ISLB/NPL
JCH = ICH/NPL
IF (JCH.LT.1) JCH = 1
JCW = ICW/NPL
IF (JCW.LT.1) JCW = 1
IF (IPLOT.GT.0) GO TO 30
CALL INITGR(IRX,IRY,JCH,JCW)
GO TO 40
C DRAW GRID
30 CALL SELFMP(IRX,IRY)
40 IC = 7
MNX0 = MNX
MNY0 = MNY
IF (ISTYLE.EQ.0) GO TO 50
MXX = MNX + LNX
MXY = MNY + LNY
IF (NY.GT.NX) LNX = FLOAT(LNX)*(ANX/ANY) + .5
IF (NX.GT.NY) LNY = FLOAT(LNY)*(ANY/ANX) + .5
MNX = MXX - LNX
MNY = MXY - LNY
C WRITE LABELS
50 AT1 = FLOAT(JCH + JCH/3)
AX = FLOAT(MNX0 - JSLB)
AY = FLOAT(MNY0) - AT1
IT1 = 50
WRITE (LBL,91) LABEL, FMAX, FMIN
CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)
AY = AY - AT1
IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)
C DRAW RASTER IMAGE
IF (FMAX.EQ.FMIN) GO TO 60
AX = FLOAT(LNX)
AY = FLOAT(LNY)
CALL MAPWIN(ZERO,AX,ZERO,AY,MNX,LNX,MNY,LNY)
CALL RASTRU(F,FMIN,FMAX,LNX,LNY,NX,NY,NXV,LW)
60 IPLOT = IPLOT + 1
IF (IPLOT.EQ.NPLOT) IPLOT = 0
IF (IPLOT.GT.0) GO TO 70
CALL SGRAPH
CALL READC(IRC)
70 RETURN
END
*
*****************************************************
* TICKS -- DRAWS BOX, TICKS, GRIDS AND LABELS AXES
*****************************************************
*
SUBROUTINE TICKS (XMAX,XMIN,YMAX,YMIN,MINX,MINY,LENX,LENY,ICH,ICW,
1ISLB,ISTCX,ISTCY,NTX,NTY,IC,LW,IGSTYL)
C THIS SUBROUTINE DRAWS BOX, TICKS, GRIDS AND LABELS AXES
C ICH, ICW = CHARACTER HEIGHT AND WIDTH
C NTX, NTY = NUMBER OF INTERVALS BETWEEN TICKS IN X AND Y DIRECTION
C ISTCX, ISTCY = SIZE OF TICK IN X AND Y DIRECTION
CHARACTER*12 LBL
91 FORMAT (E12.5)
C DRAW BOX AROUND GRAPH AND TICKS
XMN = FLOAT(MINX)
XMX = FLOAT(MINX + LENX)
YMN = FLOAT(MINY)
YMX = FLOAT(MINY + LENY)
C DRAW BOX, GRID, AND TICKS
IF (IGSTYL.EQ.1) CALL GRIDL (XMX,XMN,YMX,YMN,ISTCX,ISTCY,NTX,NTY,I
1C,LW,1)
IF (IGSTYL.EQ.2) CALL GRIDG (XMX,XMN,YMX,YMN,ICH,ICW,ISTCX,ISTCY,N
1TX,NTY,IC,LW,2)
C LABEL AXES
AX = XMN - FLOAT(ISLB)
AY = YMN - FLOAT(ISTCY + ICH + ICH/3)
AT1 = XMX - FLOAT(ISLB)
AT2 = YMX - FLOAT(ICH/2)
IT1 = 12
WRITE (LBL,91) XMIN
CALL DRSTRG(LBL,XMN,AY,IC,LW,ICW,IT1)
WRITE (LBL,91) XMAX
CALL DRSTRG(LBL,AT1,AY,IC,LW,ICW,IT1)
WRITE (LBL,91) YMIN
CALL DRSTRG(LBL,AX,YMN,IC,LW,ICW,IT1)
WRITE (LBL,91) YMAX
CALL DRSTRG(LBL,AX,AT2,IC,LW,ICW,IT1)
RETURN
END
*
*****************************************************
* BOX -- DRAWS BOX
*****************************************************
*
SUBROUTINE BOX (MINX,MINY,LENX,LENY,ICH,ICW,IC,LW,IGSTYL)
C THIS SUBROUTINE DRAWS BOX
C ICH, ICW = CHARACTER HEIGHT AND WIDTH
XMN = FLOAT(MINX)
XMX = FLOAT(MINX + LENX)
YMN = FLOAT(MINY)
YMX = FLOAT(MINY + LENY)
C DRAW BOX AROUND GRAPH
IF (IGSTYL.EQ.1) CALL BOXL (XMX,XMN,YMX,YMN,IC,LW)
IF (IGSTYL.EQ.2) CALL BOXG (XMX,XMN,YMX,YMN,ICH,ICW,IC,LW)
RETURN
END
*
*****************************************************
* CONTRU -- CONTOUR PLOT -- LOWER LEVEL ROUTINE
*****************************************************
*
SUBROUTINE CONTRU(XA,YA,Z,C,M,N,L,LINK,MV,LWTYPE)
C SUBROUTINE WRITTEN BY ART ROSS, MODIFIED BY AEINT DE BOER FOR FORT77
C BUG FIXED BY VIKTOR DECYK.
C SEVEN COLORS ARE USED TO PLOT THE CONTOURS. RED, MAGENTA, YELLOW,
C FOREGROUND, CYAN, GREEN, AND BLUE ARE USED IN GOING FROM HIGHEST TO
C LOWEST VALUES.
C USING RASTER GRAPHICS
DIMENSION ICOLOR(7)
LOGICAL*1 F1,F2,LINK
DIMENSION C(2),LIM(2),LINK(2,M,N),XA(2),YA(2),Z(MV,N)
EQUIVALENCE(MM1,LIM(1)),(NM1,LIM(2))
SAVE ICOLOR
C COLORS ARE: BLUE,GREEN,CYAN,FOREGROUND,YELLOW,MAGENTA,RED
DATA ICOLOR /1,2,3,7,6,5,4/
MM1 = M-1
NM1 = N-1
AC = 7./FLOAT(L)
DO 199 LEV=1,L
CLEV = C(1)+(LEV-1)*C(2)
IC = AC*(FLOAT(LEV) - .5)
ICTYPE = ICOLOR(IC+1) + 8
C
C MARK HORIZONTAL LINKS CROSSED BY CONTOUR.
C
DO 10 J=1,N
F1 = Z(1,J).GT.CLEV
DO 10 I=1,MM1
F2 = Z(I+1,J).GT.CLEV
LINK(1,I,J) = F1.AND..NOT.F2.OR..NOT.F1.AND.F2
10 F1 = F2
C
C MARK VERTICAL LINKS CROSSED BY CONTOUR.
C
DO 20 I=1,M
F1 = Z(I,1).GT.CLEV
DO 20 J=1,NM1
F2 = Z(I,J+1).GT.CLEV
LINK(2,I,J) = F1.AND..NOT.F2.OR..NOT.F1.AND.F2
20 F1 = F2
C
C FIRST DRAW ALL CONTOURS INTERSECTING EDGES.
C
LX = 0
LY = +1
I = 1
J = 1
ASSIGN 101 TO IFOLLW
DO 103 IDIR=1,4
LIMIT = LIM(1+IABS(LX))
LNKDIR = 1+IABS(LX)
DO 102 K=1,LIMIT
IF(.NOT.LINK(LNKDIR,I,J)) GO TO 101
LINK(LNKDIR,I,J) = .FALSE.
GO TO 1501
C
C FOLLOWING IS INTERNAL SUBROUTINE TO FOLLOW A CONTOUR, CALLING
C THE APPROPRIATE GRAPHICS ROUTINES AS IT GOES. IT STARTS AT THE LINK
C DESIGNATED BY I AND J, CROSSING IT IN THE DIRECTION INDICATED BY
C LX AND LY.
1501 II = I
JJ = J
KX = LX
KY = LY
ASSIGN 1502 TO IXY
GO TO 1601
1502 CALL DRAWG(' ',XX,YY,ICTYPE,LWTYPE,0,1)
ASSIGN 1503 TO IXY
GO TO 1504
1503 CALL DRAWG(' ',XX,YY,ICTYPE,LWTYPE,0,2)
LINK(1+IABS(KX),II,JJ) = .FALSE.
C
C IL AND JL ARE INDICES OF LL CORNER OF CELL WE ARE ENTERING
C
1504 IL = II+(KX-1)/2
JL = JJ+(KY-1)/2
IF(IL.LT.1.OR.IL.GE.M.OR.JL.LT.1.OR.JL.GE.N)
& GO TO IFOLLW,(101)
KX = -KX
KY = -KY
DO 1505 ICT=1,3
ITEMP = KX
KX = -KY
KY = +ITEMP
II = IL+(KX+1)/2
JJ = JL+(KY+1)/2
IF(LINK(1+IABS(KX),II,JJ)) GO TO 1601
1505 CONTINUE
GO TO IFOLLW,(101)
C
C FOLLOWING IS INTERNAL SUBROUTINE TO COMPUTE X AND Y
C COORDINATES OF THE POINT WHERE CONTOUR CROSSES THE LINK WHOSE
C INDICES ARE II AND JJ, WITH THE CROSSING IN THE DIRECTION DESIGNATED
C BY KX AND KY. THE LINK MARK ENTRY IS NOT CLEARED.
C
1601 XX = XA(1)+(II-1)*XA(2)
YY = YA(1)+(JJ-1)*YA(2)
ZZ = Z(II,JJ)
IF(KX) 1620,1610,1620
1610 X2 = XA(1)+II*XA(2)
Z2 = Z(II+1,JJ)
IF (Z2.NE.ZZ) XX = XX+(X2-XX)*((CLEV-ZZ)/(Z2-ZZ))
GO TO IXY,(1502,1503)
1620 Y2 = YA(1)+JJ*YA(2)
Z2 = Z(II,JJ+1)
IF (Z2.NE.ZZ) YY = YY+(Y2-YY)*((CLEV-ZZ)/(Z2-ZZ))
GO TO IXY,(1502,1503)
C
C END OF INTERNAL SUBROUTINES
101 I = I+LY
102 J = J-LX
ITEMP = LX
LX = -LY
103 LY = +ITEMP
C
C NOW DO CLOSED CONTOURS, WHICH ALL MUST EXIST ONLY IN INTERIOR OF
C ARRAY.
C
DO 132 J=1,NM1
DO 132 I=1,MM1
IF(.NOT.LINK(1,I,J)) GO TO 131
ASSIGN 131 TO IFOLLW
LX = 0
LY = +1
GO TO 2501
131 IF(.NOT.LINK(2,I,J)) GO TO 132
ASSIGN 132 TO IFOLLW
LX = +1
LY = 0
GO TO 2501
C
C FOLLOWING IS INTERNAL SUBROUTINE TO FOLLOW A CONTOUR, CALLING
C THE APPROPRIATE GRAPHICS ROUTINES AS IT GOES. IT STARTS AT THE LINK
C DESIGNATED BY I AND J, CROSSING IT IN THE DIRECTION INDICATED BY
C LX AND LY.
2501 II = I
JJ = J
KX = LX
KY = LY
ASSIGN 2502 TO IXY
GO TO 2601
2502 CALL DRAWG(' ',XX,YY,ICTYPE,LWTYPE,0,1)
ASSIGN 2503 TO IXY
GO TO 2504
2503 CALL DRAWG(' ',XX,YY,ICTYPE,LWTYPE,0,2)
LINK(1+IABS(KX),II,JJ) = .FALSE.
C
C IL AND JL ARE INDICES OF LL CORNER OF CELL WE ARE ENTERING
C
2504 IL = II+(KX-1)/2
JL = JJ+(KY-1)/2
IF(IL.LT.1.OR.IL.GE.M.OR.JL.LT.1.OR.JL.GE.N)
& GO TO IFOLLW,(131,132)
KX = -KX
KY = -KY
DO 2505 ICT=1,3
ITEMP = KX
KX = -KY
KY = +ITEMP
II = IL+(KX+1)/2
JJ = JL+(KY+1)/2
IF(LINK(1+IABS(KX),II,JJ)) GO TO 2601
2505 CONTINUE
GO TO IFOLLW,(131,132)
C
C FOLLOWING IS INTERNAL SUBROUTINE TO COMPUTE X AND Y
C COORDINATES OF THE POINT WHERE CONTOUR CROSSES THE LINK WHOSE
C INDICES ARE II AND JJ, WITH THE CROSSING IN THE DIRECTION DESIGNATED
C BY KX AND KY. THE LINK MARK ENTRY IS NOT CLEARED.
C
2601 XX = XA(1)+(II-1)*XA(2)
YY = YA(1)+(JJ-1)*YA(2)
ZZ = Z(II,JJ)
IF(KX) 2620,2610,2620
2610 X2 = XA(1)+II*XA(2)
Z2 = Z(II+1,JJ)
IF (Z2.NE.ZZ) XX = XX+(X2-XX)*((CLEV-ZZ)/(Z2-ZZ))
GO TO IXY,(2502,2503)
2620 Y2 = YA(1)+JJ*YA(2)
Z2 = Z(II,JJ+1)
IF (Z2.NE.ZZ) YY = YY+(Y2-YY)*((CLEV-ZZ)/(Z2-ZZ))
GO TO IXY,(2502,2503)
C
C END OF INTERNAL SUBROUTINES
132 CONTINUE
C
C END OF LEVEL LOOP
C
199 CONTINUE
RETURN
END
*
*****************************************************
* RASTRU -- INTERNAL RASTER SUBROUTINE
*****************************************************
*
SUBROUTINE RASTRU(F,FMIN,FMAX,LX,LY,NX,NY,NXV,LWTYPE)
C THIS SUBROUTINE CONVERTS FLOATING POINT ARRAY TO COLOR RASTER IMAGE
C SEVEN COLORS ARE USED TO CODE THE IMAGES. RED, MAGENTA, YELLOW,
C FOREGROUND, CYAN, GREEN, AND BLUE ARE USED IN GOING FROM HIGHEST TO
C LOWEST VALUES.
C USING RASTER GRAPHICS
DIMENSION F(NXV,NY)
DIMENSION ICOLOR(7)
SAVE NTC,ICOLOR
DATA NTC /8/
C COLORS ARE: BLUE,GREEN,CYAN,FOREGROUND,YELLOW,MAGENTA,RED
DATA ICOLOR /1,2,3,7,6,5,4/
LX1 = LX - 1
LY1 = LY - 1
DXG = FLOAT(NX - 1)/FLOAT(LX1)
DYG = FLOAT(NY - 1)/FLOAT(LY1)
AF = FLOAT(NTC - 1)/(FMAX - FMIN)
C LOOP OVER PIXELS
DO 40 K = 1, LY1
Y = FLOAT(K - 1)
YT = Y*DYG + 1.
M = YT
DY = YT - FLOAT(M)
DYT = 1. - DY
DO 20 J = 1, LX1
X = FLOAT(J - 1)
XT = X*DXG + 1.
N = XT
DX = XT - FLOAT(N)
DXT = 1. - DX
FC = F(N,M)*DXT*DYT + F(N+1,M)*DX*DYT + F(N,M+1)*DXT*DY + F(N+1,M+
11)*DX*DY
ICTYPE = 0
IF ((FC.LT.FMIN).OR.(FC.GT.FMAX)) GO TO 10
IC = (FC - FMIN)*AF
IF (IC.EQ.NTC) IC = NTC - 1
ICTYPE = ICOLOR(IC+1) + 8
10 CALL DRAWG(' ',X,Y,ICTYPE,LWTYPE,0,3)
20 CONTINUE
FC = F(NX,M)*DYT + F(NX,M+1)*DY
ICTYPE = 0
IF ((FC.LT.FMIN).OR.(FC.GT.FMAX)) GO TO 30
IC = (FC - FMIN)*AF
IF (IC.EQ.NTC) IC = NTC - 1
ICTYPE = ICOLOR(IC+1) + 8
30 CALL DRAWG(' ',X,Y,ICTYPE,LWTYPE,0,3)
40 CONTINUE
FC = F(NX,NY)
ICTYPE = 0
IF ((FC.LT.FMIN).OR.(FC.GT.FMAX)) GO TO 50
IC = (FC - FMIN)*AF
IF (IC.EQ.NTC) IC = NTC - 1
ICTYPE = ICOLOR(IC+1) + 8
50 CALL DRAWG(' ',X,Y,ICTYPE,LWTYPE,0,3)
RETURN
END
*
*****************************************************
* INITGR -- INITIALIZE GRAPHICS PARAMETERS
*****************************************************
*
SUBROUTINE INITGR(IRX,IRY,ICH,ICW)
C THIS SUBROUTINE INITIALIZES GRAPHICS PARAMETERS
C DEFAULT SCALING
CALL SELFMP(IRX,IRY)
C DEFAULT CHARACTER SIZE
CALL CHARSZ(ICH,ICW)
C SET CURSOR TO ZERO
CALL DRAWG(' ',0.,0.,0,0,0,1)
C CLEAR IMAGE
CALL DRAWG(' ',0.,0.,0,0,0,0)
RETURN
END
SUBROUTINE DRLINS (X,Y,N,IC,LWTYPE)
C THIS SUBROUTINE DRAWS LINES
DIMENSION X(N), Y(N)
CALL DRAWG(' ',X(1),Y(1),IC,LWTYPE,0,1)
DO 10 J = 1, N
CALL DRAWG(' ',X(J),Y(J),IC,LWTYPE,0,2)
10 CONTINUE
RETURN
END
*
*****************************************************
* DRPNTS -- DRAW POINTS
*****************************************************
*
SUBROUTINE DRPNTS (X,Y,N,IC,LWTYPE)
C THIS SUBROUTINE DRAWS POINTS
DIMENSION X(N), Y(N)
DO 10 J = 1, N
CALL DRAWG(' ',X(J),Y(J),IC,LWTYPE,0,3)
10 CONTINUE
RETURN
END
*
*****************************************************
* DRSHLS -- DRAW DASHED LINES
*****************************************************
*
SUBROUTINE DRSHLS (X,Y,N,IC,LWTYPE,L)
C THIS SUBROUTINE DRAWS DASHED LINES
DIMENSION X(N), Y(N)
CALL DRAWG(' ',X(1),Y(1),IC,LWTYPE,L,1)
DO 10 J = 1, N
CALL DRAWG(' ',X(J),Y(J),IC,LWTYPE,L,4)
10 CONTINUE
RETURN
END
*
*****************************************************
* DRSTRG -- DRAW CHARACTER STRING
*****************************************************
*
SUBROUTINE DRSTRG(CHR,AX,AY,IC,LWTYPE,ICW,NCR)
C THIS SUBROUTINE DRAWS CHARACTER STRING OF LENGTH NCR
CHARACTER*(*) CHR
DX = FLOAT(ICW)
IF (NCR.EQ.0) GO TO 20
DO 10 I = 1, NCR
AT1 = AX + DX*FLOAT(I - 1)
CALL DRAWG(CHR(I:I),AT1,AY,IC,LWTYPE,0,5)
10 CONTINUE
20 RETURN
END
*
*****************************************************
* GRIDL -- DRAW TICKS AND/OR GRIDS
*****************************************************
*
SUBROUTINE GRIDL (XMX,XMN,YMX,YMN,ISTCX,ISTCY,NTX,NTY,IC,LWTYPE,IS
1TYLE)
C THIS SUBROUTINE DRAWS TICKS AND/OR GRIDS ON GRAPH WITH LINES
C ISTYLE = (0,1,2) = DRAW (BOX,TICKS,TICKS AND GRID)
C DRAW TICKS IN Y DIRECTION
IT1 = NTY + 1
STX = FLOAT(ISTCX)
AT1 = XMN - STX
AT2 = XMX + STX
DYT = (YMX - YMN)/FLOAT(NTY)
DO 20 J = 1, IT1
AY = DYT*FLOAT(J - 1) + YMN
CALL DRAWG(' ',AT1,AY,IC,LWTYPE,0,1)
IF ((J.EQ.1).OR.(J.EQ.IT1)) GO TO 10
IF (ISTYLE.EQ.0) GO TO 20
CALL DRAWG(' ',XMN,AY,IC,LWTYPE,0,4)
IF (ISTYLE.EQ.1) CALL DRAWG(' ',XMX,AY,IC,LWTYPE,0,1)
IF (ISTYLE.EQ.2) CALL DRAWG(' ',XMX,AY,IC,LWTYPE,1,4)
10 CALL DRAWG(' ',AT2,AY,IC,LWTYPE,0,4)
20 CONTINUE
C DRAW TICKS IN X DIRECTION
IT1 = NTX + 1
STY = FLOAT(ISTCY)
AT1 = YMN - STY
AT2 = YMX + STY
DXT = (XMX - XMN)/FLOAT(NTX)
DO 40 J = 1, IT1
AX = DXT*FLOAT(J - 1) + XMN
CALL DRAWG(' ',AX,AT1,IC,LWTYPE,0,1)
IF ((J.EQ.1).OR.(J.EQ.IT1)) GO TO 30
IF (ISTYLE.EQ.0) GO TO 40
CALL DRAWG(' ',AX,YMN,IC,LWTYPE,0,4)
IF (ISTYLE.EQ.1) CALL DRAWG(' ',AX,YMX,IC,LWTYPE,0,1)
IF (ISTYLE.EQ.2) CALL DRAWG(' ',AX,YMX,IC,LWTYPE,1,4)
30 CALL DRAWG(' ',AX,AT2,IC,LWTYPE,0,4)
40 CONTINUE
RETURN
END
*
*****************************************************
* GRIDG -- DRAW TICKS AND/OR GRIDS
*****************************************************
*
SUBROUTINE GRIDG (XMX,XMN,YMX,YMN,ICH,ICW,ISTCX,ISTCY,NTX,NTY,IC,L
1WTYPE,ISTYLE)
C THIS SUBROUTINE DRAWS TICKS AND/OR GRIDS ON GRAPH WITH CHARACTERS
C ISTYLE = (0,1,2) = DRAW (BOX,TICKS,TICKS AND GRID)
DX = FLOAT(ICW)
DY = FLOAT(ICH)
DXH = FLOAT(ICW/2)
DYH = FLOAT(ICH/2)
DXT = (XMX - XMN)/FLOAT(NTX)
DYT = (YMX - YMN)/FLOAT(NTY)
NCRX = (XMX - XMN)/DX + 1.5
NCRY = (YMX - YMN)/DY + 1.5
DX = (XMX - XMN)/FLOAT(NCRX - 1)
DY = (YMX - YMN)/FLOAT(NCRY - 1)
C DRAW TICKS IN Y DIRECTION
IT1 = NTY + 1
STX = FLOAT(ISTCX)
AT1 = XMN - STX
AT2 = XMX + STX
NCRT = STX/DX + .5
DO 70 J = 1, IT1
IN = 1
IF ((J.EQ.1).OR.(J.EQ.IT1)) IN = 0
IY = DYT*FLOAT(J - 1)/DY + .5
AY = DY*FLOAT(IY) + YMN - DYH
C EXTERIOR LEFT TICKS
IF ((IN.EQ.1).AND.(ISTYLE.EQ.0)) GO TO 20
DO 10 I = 1, NCRT
AT3 = AT1 + DX*FLOAT(I - 1) - DXH
CALL DRAWG('-',AT3,AY,IC,LWTYPE,0,5)
10 CONTINUE
C GRIDS AND INTERIOR TICKS
20 AX = DXT
IX = AX/DX + .5
DO 50 I = 1, NCRX
I1 = I - 1
AT3 = XMN + DX*FLOAT(I1) - DXH
IF ((I.EQ.1).OR.(I.EQ.NCRX)) GO TO 40
IF ((IN.EQ.1).AND.(ISTYLE.LE.1)) GO TO 50
IF ((ISTYLE.GT.0).AND.(I1.EQ.IX)) GO TO 30
CALL DRAWG('-',AT3,AY,IC,LWTYPE,0,5)
GO TO 50
30 AX = AX + DXT
IX = AX/DX + .5
40 CALL DRAWG('+',AT3,AY,IC,LWTYPE,0,5)
50 CONTINUE
C EXTERIOR RIGHT TICKS
IF ((IN.EQ.1).AND.(ISTYLE.EQ.0)) GO TO 70
DO 60 I = 1, NCRT
AT3 = XMX + DX*FLOAT(I) - DXH
CALL DRAWG('-',AT3,AY,IC,LWTYPE,0,5)
60 CONTINUE
70 CONTINUE
C DRAW TICKS IN X DIRECTION
IT1 = NTX + 1
STY = FLOAT(ISTCY)
AT1 = YMN - STY
AT2 = YMX + STY
NCRT = STY/DY + .5
DO 130 J = 1, IT1
IN = 1
IF ((J.EQ.1).OR.(J.EQ.IT1)) IN = 0
IX = DXT*FLOAT(J - 1)/DX + .5
AX = DX*FLOAT(IX) + XMN - DXH
C EXTERIOR BOTTOM TICKS
IF ((IN.EQ.1).AND.(ISTYLE.EQ.0)) GO TO 90
DO 80 I = 1, NCRT
AT3 = AT1 + DY*FLOAT(I - 1) - DYH
CALL DRAWG('|',AX,AT3,IC,LWTYPE,0,5)
80 CONTINUE
C GRIDS AND INTERIOR TICKS
90 AY = DYT
IY = AY/DY + .5
DO 110 I = 1, NCRY
I1 = I - 1
AT3 = YMN + DY*FLOAT(I1) - DYH
IF ((I.EQ.1).OR.(I.EQ.NCRY)) GO TO 110
IF ((IN.EQ.1).AND.(ISTYLE.LE.1)) GO TO 110
IF ((ISTYLE.GT.0).AND.(I1.EQ.IY)) GO TO 100
CALL DRAWG('|',AX,AT3,IC,LWTYPE,0,5)
GO TO 110
100 AY = AY + DYT
IY = AY/DY + .5
110 CONTINUE
C EXTERIOR TOP TICKS
IF ((IN.EQ.1).AND.(ISTYLE.EQ.0)) GO TO 130
DO 120 I = 1, NCRT
AT3 = YMX + DY*FLOAT(I) - DYH
CALL DRAWG('|',AX,AT3,IC,LWTYPE,0,5)
120 CONTINUE
130 CONTINUE
RETURN
END
*
*****************************************************
* BOXL -- DRAW BOX AROUND GRAPH WITH LINES
*****************************************************
*
SUBROUTINE BOXL (XMX,XMN,YMX,YMN,IC,LWTYPE)
C THIS SUBROUTINE DRAWS BOX AROUND GRAPH WITH LINES
CALL DRAWG(' ',XMN,YMN,IC,LWTYPE,0,1)
CALL DRAWG(' ',XMX,YMN,IC,LWTYPE,0,2)
CALL DRAWG(' ',XMX,YMX,IC,LWTYPE,0,2)
CALL DRAWG(' ',XMN,YMX,IC,LWTYPE,0,2)
CALL DRAWG(' ',XMN,YMN,IC,LWTYPE,0,2)
RETURN
END
*
*****************************************************
* BOXG -- DRAW BOX AROUND GRAPH WITH CHARACTERS
*****************************************************
*
SUBROUTINE BOXG (XMX,XMN,YMX,YMN,ICH,ICW,IC,LWTYPE)
C THIS SUBROUTINE DRAWS BOX AROUND GRAPH WITH CHARACTERS
DX = FLOAT(ICW)
DY = FLOAT(ICH)
DXH = FLOAT(ICW/2)
DYH = FLOAT(ICH/2)
NCRX = (XMX - XMN)/DX + 1.5
NCRY = (YMX - YMN)/DY + 1.5
DX = (XMX - XMN)/FLOAT(NCRX - 1)
DY = (YMX - YMN)/FLOAT(NCRY - 1)
C DRAWS LINES IN X DIRECTION
AT2 = YMN - DYH
AT3 = YMX - DYH
DO 20 I = 1, NCRX
AT1 = XMN + DX*FLOAT(I - 1) - DXH
IF ((I.EQ.1).OR.(I.EQ.NCRX)) GO TO 10
CALL DRAWG('-',AT1,AT2,IC,LWTYPE,0,5)
CALL DRAWG('-',AT1,AT3,IC,LWTYPE,0,5)
GO TO 20
10 CALL DRAWG('+',AT1,AT2,IC,LWTYPE,0,5)
CALL DRAWG('+',AT1,AT3,IC,LWTYPE,0,5)
20 CONTINUE
C DRAWS LINES IN Y DIRECTION
AT2 = XMN - DXH
AT3 = XMX - DXH
DO 30 I = 1, NCRY
IF ((I.EQ.1).OR.(I.EQ.NCRY)) GO TO 30
AT1 = YMN + DY*FLOAT(I - 1) - DYH
CALL DRAWG('|',AT2,AT1,IC,LWTYPE,0,5)
CALL DRAWG('|',AT3,AT1,IC,LWTYPE,0,5)
30 CONTINUE
RETURN
END
*
*****************************************************
* SGRAPH -- WRITES OUT PLOT TO DEVICE
*****************************************************
*
SUBROUTINE SGRAPH
C THIS SUBROUTINE WRITES OUT PLOT TO DEVICE
CALL DRAWG(' ',0.,0.,0,0,0,6)
RETURN
END
*
*****************************************************
* READC
*****************************************************
*
SUBROUTINE READC(IRC)
CHARACTER*1 C
CHARACTER*8 CX
CHARACTER*37 CHR1
CHARACTER*13 CHR2
91 FORMAT (1X,A37)
92 FORMAT (1X,A13)
DATA CHR1 /' Q=QUIT, S=SAVE, M=MODIFY, R=REVERSE '/
DATA CHR2 /' CR=CONTINUE '/
IRC = 0
10 CALL CINPUT(CX)
C = CX(1:1)
IF (C.NE.'?') GO TO 20
CALL CLEAR
WRITE (6,91) CHR1
WRITE (6,92) CHR2
GO TO 10
20 IF ((C.EQ.'Q').OR.(C.EQ.'q')) IRC = 1
IF ((C.EQ.'S').OR.(C.EQ.'s')) IRC = 2
IF ((C.EQ.'M').OR.(C.EQ.'m')) IRC = 3
IF ((C.EQ.'R').OR.(C.EQ.'r')) IRC = 4
RETURN
END
*
*****************************************************
* WPARAM --
*****************************************************
*
SUBROUTINE WPARAM (RUNID,INDX,MOVION,NPX,NPXB,T0,TEND,DT,AX,VTX,ED
1GE,RMASS,RTEMP,VDX,VTDX,IBCS,BVL,BVR,NUSTRT,NTR,NTI,NPP,NTW,NTT,NP
2ROBT,NDIST,NTP,MODES,NDP,NTV,NMV,NXB,NPRS,NPRO,NDV,NTD,MODED,NDD,A
3NLE,ANSE,AMODEN,FREQN,ANLI,ANSI,AMODEX,FREQ,TRMP,TOFF,QME,QMI,QMB,
4QTEST,VTEST,X0,CI,IRC)
CHARACTER*128 CHR
CHARACTER*8 RUNID
901 FORMAT (8H RUNID= ,A8)
902 FORMAT (6H INDX=,I3,5H NPX=,I8,5H VTX=,F10.7,4H CI=,F8.4,5H QME=,F
18.4)
903 FORMAT (6H IBCS=,I2,5H BVL=,F14.7,5H BVR=,F14.7)
904 FORMAT (4H T0=,F8.1,6H TEND=,F8.1,4H DT=,F8.5)
905 FORMAT (8H MOVION=,I2,7H RMASS=,F14.7,7H RTEMP=,F14.7,5H QMI=,F8.4
1)
906 FORMAT (6H NPXB=,I8,5H VDX=,F10.7,6H VTDX=,F10.7,5H QMB=,F8.4)
907 FORMAT (5H NPP=,I6,5H NTI=,I4,4H AX=,F8.5,6H EDGE=,F8.5)
908 FORMAT (8H NUSTRT=,I2,5H NTR=,I6)
909 FORMAT (5H NTW=,I6)
910 FORMAT (5H NTT=,I6,8H NPROBT=,I8,7H NDIST=,I5)
911 FORMAT (5H NTP=,I6,7H MODES=,I5,5H NDP=,I6)
912 FORMAT (5H NTV=,I6,5H NMV=,I5,5H NXB=,I4,6H NPRS=,I3,6H NPRO=,I3,5
1H NDV=,I6)
913 FORMAT (5H NTD=,I6,7H MODED=,I5,5H NDD=,I6)
914 FORMAT (6H ANLE=,F14.7,6H ANSE=,F14.7)
915 FORMAT (8H AMODEN=,F8.3,7H FREQN=,F14.7)
916 FORMAT (6H ANLI=,F14.7,6H ANSI=,F14.7)
917 FORMAT (8H AMODEX=,F8.3,6H FREQ=,F14.7,6H TRMP=,F8.1,6H TOFF=,F8.1
1)
918 FORMAT (7H QTEST=,F11.5,7H VTEST=,F5.2,4H X0=,F8.1)
SAVE LW,IC
DATA LW,IC /1,7/
IRC = 0
CALL GRPARM(3,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY
1,NTCX,NTCY,IGSTYL)
CALL INITGR(IRX,IRY,ICH,ICW)
AT1 = FLOAT(ICH + ICH/3)
AX = FLOAT(MINX)
WRITE (CHR,901) RUNID
AY = FLOAT(MINY + LENY) - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,16)
WRITE (CHR,902) INDX, NPX, VTX, CI, QME
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,62)
WRITE (CHR,903) IBCS, BVL, BVR
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,46)
WRITE (CHR,904) T0, TEND, DT
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,38)
WRITE (CHR,905) MOVION, RMASS, RTEMP, QMI
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,65)
WRITE (CHR,906) NPXB, VDX, VTDX, QMB
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,58)
WRITE (CHR,907) NPP, NTI, AX, EDGE
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,46)
WRITE (CHR,908) NUSTRT, NTR
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,21)
WRITE (CHR,909) NTW
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,11)
WRITE (CHR,910) NTT, NPROBT, NDIST
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,39)
WRITE (CHR,911) NTP, MODES, NDP
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,34)
WRITE (CHR,912) NTV, NMV, NXB, NPRS, NPRO, NDV
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,60)
WRITE (CHR,913) NTD, MODED, NDD
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,34)
WRITE (CHR,914) ANLE, ANSE
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,40)
WRITE (CHR,915) AMODEN, FREQN
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,37)
WRITE (CHR,916) ANLI, ANSI
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,40)
WRITE (CHR,917) AMODEX, FREQ, TRMP, TOFF
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,64)
WRITE (CHR,918) QTEST, VTEST, X0
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,42)
CALL SGRAPH
CALL READC(IRC)
RETURN
END
*
*****************************************************
* WPCORR
*****************************************************
*
SUBROUTINE WPCORR (RUNID,INDX,NTP,MODES,IBCS,T0,TEND,DT,CENG,LTS,I
1TS,NTS,KMIN,KMAX,NTD,NTC,WMIN,WMAX,DW,IRC)
CHARACTER*128 CHR
CHARACTER*8 RUNID
900 FORMAT (39H SPECTRUM ANALYSIS FOR 1D PERIODIC DATA)
901 FORMAT (8H RUNID= ,A8,6H INDX=,I3,5H NTP=,I6,7H MODES=,I5,6H IBCS=
1,I2)
902 FORMAT (4H T0=,F8.1,6H TEND=,F8.1,4H DT=,F8.5,6H CENG=,E14.7)
903 FORMAT (5H LTS=,I6,5H ITS=,I6, 5H NTS=,I6)
904 FORMAT (6H KMIN=,I6,6H KMAX=,I6)
905 FORMAT (5H NTD=,I6,5H NTC=,I6)
906 FORMAT (6H WMIN=,F8.4,6H WMAX=,F8.4,4H DW=,F8.4)
SAVE LW,IC
DATA LW,IC /1,7/
IRC = 0
CALL GRPARM(3,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY
1,NTCX,NTCY,IGSTYL)
CALL INITGR(IRX,IRY,ICH,ICW)
AT1 = FLOAT(ICH + ICH/3)
AX = FLOAT(MINX)
WRITE (CHR,900)
AY = FLOAT(MINY + LENY) - 2.*AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,39)
WRITE (CHR,901) RUNID, INDX, NTP, MODES, IBCS
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,56)
WRITE (CHR,902) T0, TEND, DT, CENG
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,58)
WRITE (CHR,903) LTS, ITS, NTS
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,33)
WRITE (CHR,904) KMIN, KMAX
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,24)
WRITE (CHR,905) NTD, NTC
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,22)
WRITE (CHR,906) WMIN, WMAX, DW
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,40)
CALL SGRAPH
CALL READC(IRC)
RETURN
END
*
*****************************************************
* WPCLDS
*****************************************************
*
SUBROUTINE WPCLDS (RUNID,INDX,NTP,MODES,IBCS,T0,TEND,DT,CENG,VTEST
1,QTEST,NP,LTS,ITS,NTS,MTS,NXD,NXS,LAB,IRC)
CHARACTER*128 CHR
CHARACTER*8 RUNID
900 FORMAT (38H DISPLAY SUBTRACTED DATA FOR 1D CLOUDS)
901 FORMAT (8H RUNID= ,A8,6H INDX=,I3,5H NTP=,I6,7H MODES=,I5,6H IBCS=
1,I2)
902 FORMAT (4H T0=,F8.1,6H TEND=,F8.1,4H DT=,F8.5,6H CENG=,E14.7)
903 FORMAT (9H VTEST = ,F5.2,9H QTEST = ,F11.5,6H NP = ,I8)
904 FORMAT (5H LTS=,I6,5H ITS=,I6,5H NTS=,I6,5H MTS=,I6)
905 FORMAT (5H LAB=,I6,5H NXD=,I6,5H NXS=,I6)
SAVE LW,IC
DATA LW,IC /1,7/
IRC = 0
CALL GRPARM(3,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY
1,NTCX,NTCY,IGSTYL)
CALL INITGR(IRX,IRY,ICH,ICW)
AT1 = FLOAT(ICH + ICH/3)
AX = FLOAT(MINX)
WRITE (CHR,900)
AY = FLOAT(MINY + LENY) - 2.*AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,38)
WRITE (CHR,901) RUNID, INDX, NTP, MODES, IBCS
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,56)
WRITE (CHR,902) T0, TEND, DT, CENG
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,58)
WRITE (CHR,903) VTEST, QTEST, NP
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,48)
WRITE (CHR,904) LTS, ITS, NTS, MTS
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,44)
WRITE (CHR,905) LAB, NXD, NXS
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,33)
CALL SGRAPH
CALL READC(IRC)
RETURN
END
*
*****************************************************
* WPPRFL
*****************************************************
*
SUBROUTINE WPPRFL (RUNID,INDX,MOVION,NTV,NPRS,NPRO,T0,TEND,DT,RMAS
1S,LTS,ITS,NTS,MTS,IDS,NDS,ION,IFL,IRC)
CHARACTER*128 CHR
CHARACTER*8 RUNID
900 FORMAT (37H DISPLAY SPATIAL PROFILES FOR 1D DATA)
901 FORMAT (8H RUNID= ,A8,6H INDX=,I3,8H MOVION=,I2,5H NTV=,I6,6H NPRS
1=,I3,6H NPRO=,I3)
902 FORMAT (4H T0=,F8.1,6H TEND=,F8.1,4H DT=,F8.5,7H RMASS=,F14.7)
903 FORMAT (5H LTS=,I6,5H ITS=,I6,5H NTS=,I6,5H MTS=,I6)
904 FORMAT (5H IDS=,I6,5H NDS=,I6,5H ION=,I6,5H IFL=,I6)
SAVE LW,IC
DATA LW,IC /1,7/
IRC = 0
CALL GRPARM(3,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY
1,NTCX,NTCY,IGSTYL)
CALL INITGR(IRX,IRY,ICH,ICW)
AT1 = FLOAT(ICH + ICH/3)
AX = FLOAT(MINX)
WRITE (CHR,900)
AY = FLOAT(MINY + LENY) - 2.*AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,37)
WRITE (CHR,901) RUNID, INDX, MOVION, NTV, NPRS, NPRO
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,64)
WRITE (CHR,902) T0, TEND, DT, RMASS
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,59)
WRITE (CHR,903) LTS, ITS, NTS, MTS
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,44)
WRITE (CHR,904) IDS, NDS, ION, IFL
AY = AY - AT1
CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,44)
CALL SGRAPH
CALL READC(IRC)
RETURN
END
*
*****************************************************
* GCLOSE
*****************************************************
*
SUBROUTINE GCLOSE
C THIS SUBROUTINE CLOSES GRAPHICS LIBRARY
COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE
IF (IPLOT.EQ.0) GO TO 10
CALL SGRAPH
CALL READC(IRC)
10 CALL QUITG
RETURN
END
*
*****************************************************
* VERSTC -- TEKTRONIX TO RASTER CONVERSION
*****************************************************
*
C TEKTRONIX EMULATOR LIBRARY FOR RASTER PLOTS
SUBROUTINE VERSTC (IA,IC,IRB)
C THIS PROGRAM SENDS TEKTRONIX 4012 INFORMATION TO RASTER FILE
C WRITTEN FOR THE IBM 3090VF - VIKTOR K. DECYK, UCLA
COMMON /DEVICE/ ID, ICFLG
CHARACTER*1 LBL
DIMENSION IA(4)
DIMENSION LT(8), ICOLOR(8), LW(3), IATE(128)
SAVE IG,NF,ND,IRD,IX,IY,IF,LS,LT,ICOLOR,LW,IATE
SAVE XS,YS,ICX,ICY,IHY,IBY,LTYPE,ICTYPE,LWTYPE
SAVE LX,LY,IYH,IYL,IXH,IXL
93 FORMAT (1H1,I6,17H FRAME(S) PLOTTED)
DATA IG,NF,ND,IP,IRD,IZ,IF,LS /0,0,0,0,0,0,0,0/
C LINE STYLE TABLE
DATA LT /0,1,2,3,4,0,0,0/
C COLORS TABLE: FOREGROUND,BLUE,RED,YELLOW,CYAN,MAGENTA,GREEN,FOREGROUND
DATA ICOLOR /7,1,4,6,3,5,2,7/
C LINE WIDTH TABLE
DATA LW /1,2,1/
C EBCDIC CODE FOR ASCII 124 IS NON-STANDARD
DATA IATE /0,1,2,3,55,45,46,47,22,5,37,11,12,13,14,15,16,17,18,19,
160,61,50,38,24,25,63,39,34,29,53,31,64,90,127,123,91,108,80,125,77
2,93,92,78,107,96,75,97,240,241,242,243,244,245,246,247,248,249,122
3,94,76,126,110,111,124,193,194,195,196,197,198,199,200,201,209,210
4,211,212,213,214,215,216,217,226,227,228,229,230,231,232,233,173,2
524,189,95,109,121,129,130,131,132,133,134,135,136,137,145,146,147,
6148,149,150,151,152,153,162,163,164,165,166,167,168,169,192,79,208
7,161,7/
IRB = 0
IF (IC.LT.1) GO TO 300
K = 1
IF (IRD.EQ.0) GO TO 290
GO TO (10,70,220,230,250), IRD
C READ CHARACTER
10 IRD = 1
IF (K.GT.IC) GO TO 310
LC = IA(K)
K = K + 1
20 IF (LC.LT.32) GO TO 30
IF (IG.GT.0) GO TO 200
C ALPHA MODE
C LBL = CHAR(LC)
LBL = CHAR(IATE(LC+1))
C PLOT CHARACTER
AX = FLOAT(IX)
AY = FLOAT(IY)
CALL DRAWG(LBL,AX,AY,ICTYPE,LWTYPE,0,5)
GO TO 150
C CONTROL CHARACTERS
30 IF (LC.EQ.29) GO TO 40
IF (LC.EQ.13) GO TO 50
IF (LC.EQ.31) GO TO 60
IF (LC.EQ.27) GO TO 70
IF (LC.EQ.28) GO TO 140
IF (LC.EQ.9) GO TO 150
IF (LC.EQ.10) GO TO 160
IF (LC.EQ.8) GO TO 170
IF (LC.EQ.11) GO TO 180
IF (LC.EQ.7) GO TO 190
C UNKNOWN CONTROL CHARACTER
GO TO 10
C SET GRAPH MODE (DARK VECTOR)
40 IG = 2
GO TO 10
C CARRIAGE RETURN
50 IX = IZ
C SET ALPHA MODE
60 IG = 0
GO TO 10
C ESCAPE SEQUENCE
70 IRD = 2
IF (K.GT.IC) GO TO 310
LC = IA(K)
K = K + 1
IF (LC.EQ.12) GO TO 80
IF (LC.EQ.23) GO TO 90
IF (LC.EQ.56) GO TO 100
IF (LC.EQ.57) GO TO 110
IF (LC.EQ.58) GO TO 120
IF (LC.EQ.59) GO TO 130
IF ((LC.GE.96).AND.(LC.LE.119)) GO TO 135
C UNSUPPORTED ESCAPE SEQUENCE
GO TO 10
C NEW FRAME
80 NF = NF + 1
IF (NF.LT.ND) GO TO 89
IF (NF.EQ.ND) GO TO 85
IF (ID.EQ.1) CALL LABELF(NF)
CALL DRAWG(' ',0.,0.,0,0,0,6)
ND = ND + 1
IF (ID.GT.1) GO TO 85
CALL READN(IRC,NRC)
IF (IRC.NE.1) GO TO 83
CALL QUITG
WRITE (6,93) NF
STOP 1
83 IF (IRC.EQ.2) ND = NRC - 1
IF (NF.LT.ND) GO TO 89
IF (NF.EQ.ND) GO TO 85
NF = 0
IRD = 1
IRB = 1
IF (NF.LT.ND) GO TO 84
CALL CHARSZ(ICY,ICX)
CALL DRAWG(' ',0.,0.,0,0,0,0)
LTYPE = LT(1)
ICTYPE = ICOLOR(1)
LWTYPE = LW(1)
84 IG = 0
LS = 0
IF = 0
IX = IZ
IY = IHY
GO TO 310
85 CALL DRAWG(' ',0.,0.,0,0,0,0)
LTYPE = LT(1)
ICTYPE = ICOLOR(1)
LWTYPE = LW(1)
89 IG = 0
LS = 0
IF = 0
IX = IZ
IY = IHY
GO TO 10
C MAKE HARDCOPY
90 IF (IP.GT.0) GO TO 10
GO TO 10
C LARGE CHARACTERS
100 ICX = 14.*XS + .5
ICY = 22.*YS + .5
CALL CHARSZ(ICY,ICX)
GO TO 10
C MEDIUM-LARGE CHARACTERS
110 ICX = 13.*XS + .5
ICY = 21.*YS + .5
CALL CHARSZ(ICY,ICX)
GO TO 10
C MEDIUM-SMALL CHARACTERS
120 ICX = 9.*XS + .5
ICY = 13.*YS + .5
CALL CHARSZ(ICY,ICX)
GO TO 10
C SMALL CHARACTERS
130 ICX = 8.*XS + .5
ICY = 12.*YS + .5
CALL CHARSZ(ICY,ICX)
GO TO 10
C SET LINE STYLE AND FOCUS
135 LS = LC - 96
IF = LS/8
LS = LS - IF*8
LTYPE = LT(1)
IF (ICFLG.NE.1) LTYPE = LT(LS+1)
ICTYPE = ICOLOR(1)
IF (ICFLG.NE.0) ICTYPE = ICOLOR(LS+1)
LWTYPE = LW(IF+1)
GO TO 10
C POINT PLOTTING MODE
140 IG = 3
GO TO 10
C TAB
150 IX = IX + ICX
IF (IX.LT.LX) GO TO 10
IX = IX - LX
C LINE FEED
160 IY = IY - ICY
IF (IY.LT.IZ) IY = IHY
GO TO 10
C BACKSPACE
170 IX = IX - ICX
IF (IX.GE.IZ) GO TO 10
IX = IX + LX
C VERTICAL TAB
180 IY = IY + ICY
IF (IY.GE.LY) IY = IBY
GO TO 10
C BELL (SET VECTOR TO DRAW)
190 IF (IG.EQ.2) IG = 1
GO TO 10
C GRAPH MODE
C DECODE ADDRESS
200 IF (LC.LT.64) GO TO 240
IF (LC.LT.96) GO TO 260
210 IYL = LC
220 IRD = 3
IF (K.GT.IC) GO TO 310
LC = IA(K)
K = K + 1
IF (LC.GE.96) GO TO 210
IF (LC.GE.64) GO TO 260
IF (LC.LT.32) GO TO 220
IXH = LC
230 IRD = 4
IF (K.GT.IC) GO TO 310
LC = IA(K)
K = K + 1
IF (LC.GE.32) GO TO 260
GO TO 230
240 IYH = LC
250 IRD = 5
IF (K.GT.IC) GO TO 310
LC = IA(K)
K = K + 1
IF (LC.GE.96) GO TO 210
IF (LC.LT.32) GO TO 250
260 IXL = LC
C CALCULATE ADDRESS
I = (IXH - 34)*32 + IXL
J = (IYH - 35)*32 + IYL
I = XS*FLOAT(I) + .5
J = YS*FLOAT(J) + .5
C PERFORM CLIPPING
IF (I.LT.IZ) I = IZ
IF (I.GE.LX) I = LX - 1
IF (J.LT.IZ) J = IZ
IF (J.GE.LY) J = LY - 1
C CONVERT TO FLOATING POINT REPRESENTATION
AX = FLOAT(I)
AY = FLOAT(J)
IF (IG.NE.1) GO TO 270
C DRAW VECTOR
IF (ICFLG.EQ.1) CALL DRAWG(' ',AX,AY,ICTYPE,LWTYPE,0,2)
IF (ICFLG.NE.1) CALL DRAWG(' ',AX,AY,ICTYPE,LWTYPE,LTYPE,4)
IX = I
IY = J
GO TO 10
C PERFORM MOVE AND SET VECTOR TO DRAW
270 IF (IG.EQ.3) GO TO 280
CALL DRAWG(' ',AX,AY,ICTYPE,LWTYPE,0,1)
IX = I
IY = J
IG = 1
GO TO 10
C PLOT POINT
280 CALL DRAWG(' ',AX,AY,ICTYPE,LWTYPE,0,3)
IX = I
IY = J
GO TO 10
C SET SCALES FOR FIRST PLOT
290 CALL STARTG
CALL GRPARM(3,LX,LY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY,N
1TCX,NTCY,IGSTYL)
XS = FLOAT(LX - 1)/1023.
YS = FLOAT(LY - 1)/780.
ICX = 14.*XS + .5
ICY = 22.*YS + .5
IHY = 767.*YS + .5
IBY = IZ
IX = IBY
IY = IHY
LTYPE = LT(1)
ICTYPE = ICOLOR(1)
LWTYPE = LW(1)
CALL INITGR(LX,LY,ICY,ICX)
GO TO 10
C LAST PLOT
300 NF = NF + 1
IF (NF.GT.ND) GO TO 301
CALL DRAWG(' ',0.,0.,0,0,0,0)
301 IF (ID.EQ.1) CALL LABELF(NF)
CALL DRAWG(' ',0.,0.,0,0,0,6)
ND = ND + 1
IF (ID.GT.1) GO TO 305
CALL READN(IRC,NRC)
IF (IRC.NE.1) GO TO 303
CALL QUITG
WRITE (6,93) NF
STOP 1
303 IF (IRC.EQ.2) ND = NRC - 1
IF (NF.LE.ND) GO TO 305
NF = 0
IRD = 1
IRB = 1
IF (NF.LT.ND) GO TO 304
CALL CHARSZ(ICY,ICX)
CALL DRAWG(' ',0.,0.,0,0,0,0)
LTYPE = LT(1)
ICTYPE = ICOLOR(1)
LWTYPE = LW(1)
304 IG = 0
LS = 0
IF = 0
IX = IZ
IY = IHY
GO TO 310
305 CALL QUITG
WRITE (6,93) NF
310 RETURN
END
*
*****************************************************
* LABELF -- PUTS LABEL IN GRAPHS FOR RASTER PLOTS
*****************************************************
*
SUBROUTINE LABELF(NF)
C THIS SUBROUTINE PUTS LABEL IN GRAPHS FOR RASTER PLOTS
CHARACTER*9 LBL
SAVE LW,IC
DATA LW,IC /1,7/
CALL GRPARM(3,LX,LY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY,N
1TCX,NTCY,IGSTYL)
CALL CHARSZ(ICH,ICW)
AX = FLOAT(MINX + LENX - 9*ICW - 1)
AY = FLOAT(MINY)
IS = ICHAR('0')
ID = 0
N = NF
10 ID = ID + 1
N = N/10
IF (N.GT.0) GO TO 10
LBL = '# '
NT = NF
LS = 10**(ID - 1)
DO 20 I = 1, ID
I1 = I + 1
N = NT/LS
LBL (I1:I1) = CHAR(N+IS)
NT = NT - N*LS
LS = LS/10
20 CONTINUE
N = ID + 1
CALL DRSTRG(LBL,AX,AY,IC,LW,ICW,N)
RETURN
END
*
*****************************************************
* READN -- READS CHARACTERS
*****************************************************
*
SUBROUTINE READN(IRC,NRC)
C THIS SUBROUTINE READS CHARACTERS AND OUTPUTS CODE AND VALUE
CHARACTER*1 C
CHARACTER*8 CX
CHARACTER*40 CHR
91 FORMAT (1X,A40)
DATA CHR /' Q=QUIT, #=DISPLAY FRAME #, CR=CONTINUE '/
IRC = 0
NRC = 0
10 CALL CINPUT(CX)
C = CX(1:1)
IF (C.NE.'?') GO TO 20
CALL CLEAR
WRITE (6,91) CHR
GO TO 10
20 IF ((C.EQ.'Q').OR.(C.EQ.'q')) IRC = 1
IF (IRC.EQ.1) GO TO 30
CALL EVALC(CX,IVAL,VAL,ID)
IF (ID.EQ.0) GO TO 30
NRC = IVAL
IRC = 2
30 RETURN
END
*
*****************************************************
* SELFMP -- INITIALIZES DEFAULT MAPPING
*****************************************************
*
SUBROUTINE SELFMP(IRX,IRY)
C THIS SUBROUTINE INITIALIZES DEFAULT MAPPING
COMMON /RCOM/ MINX,LENX,MINY,LENY,ICX,ICY,
1XMIN,XMAX,YMIN,YMAX,DX,DY,CSX,CSY
MINX = 0
LENX = IRX - 1
MINY = 0
LENY = IRY - 1
XMIN = FLOAT(MINX)
XMAX = FLOAT(MINX + LENX)
YMIN = FLOAT(MINY)
YMAX = FLOAT(MINY + LENY)
DX = FLOAT(LENX)/(XMAX - XMIN)
DY = FLOAT(LENY)/(YMAX - YMIN)
RETURN
END
*
*****************************************************
* MAPWIN -- SETS UP VARIABLE MAPPING
*****************************************************
*
SUBROUTINE MAPWIN(XMN,XMX,YMN,YMX,MNX,LNX,MNY,LNY)
C THIS SUBROUTINE SETS UP VARIABLE MAPPING
COMMON /RCOM/ MINX,LENX,MINY,LENY,ICX,ICY,
1XMIN,XMAX,YMIN,YMAX,DX,DY,CSX,CSY
MINX = MNX
LENX = LNX
MINY = MNY
LENY = LNY
XMIN = XMN
XMAX = XMX
YMIN = YMN
YMAX = YMX
DX = FLOAT(LENX)/(XMAX - XMIN)
DY = FLOAT(LENY)/(YMAX - YMIN)
RETURN
END
*
*****************************************************
* CHARSZ -- SETS UP VARIABLE MAPPING
*****************************************************
*
SUBROUTINE CHARSZ(ICH,ICW)
C THIS SUBROUTINE SETS UP VARIABLE MAPPING
COMMON /RCOM/ MINX,LENX,MINY,LENY,ICX,ICY,
1XMIN,XMAX,YMIN,YMAX,DX,DY,CSX,CSY
CSX = FLOAT(ICW)/14.
CSY = FLOAT(ICH)/16.
RETURN
END
*
*****************************************************
* ZIMAGE ZEROES OUT IMAGE
*****************************************************
*
SUBROUTINE ZIMAGE(G,BLANK,LX,LY)
C THIS SUBROUTINE ZEROES OUT IMAGE
CHARACTER*1 G(LX,LY)
CHARACTER*1 BLANK
DO 20 K = 1, LY
DO 10 J = 1, LX
G(J,K) = BLANK
10 CONTINUE
20 CONTINUE
RETURN
END
*
*****************************************************
* CDRAW -- DRAWS CHARACTER WITH ASCII CODE IC AT IX,IY
*****************************************************
*
SUBROUTINE CDRAW(G,CTYPE,BLANK,LX,LY,IC,IX,IY,ICX,ICY,SX,SY,LWTYPE
1)
C THIS SUBROUTINE DRAWS CHARACTER WITH ASCII CODE IC AT LOCATION IX,IY
C WITH SCALING FACTORS SX,SY
C FOR RASTER FILE
CHARACTER*1 G(LX,LY)
CHARACTER*1 CTYPE,BLANK
DIMENSION LB(8)
DIMENSION ICFLEN(94), ICFLOC(94)
DIMENSION ICFON1(114), ICFON2(114), ICFONT(228)
EQUIVALENCE (ICFON1(1), ICFONT(1)), (ICFON2(1), ICFONT(115))
SAVE LW,NW,ICFLEN,ICFLOC,ICFONT
DATA LW,NW /8,-2147483647/
DATA ICFLEN /10,10,20,35,43,25,5,9,9,15,10,7,5,5,5,32,12,21,28,9,1
19,23,9,35,23,10,12,7,10,7,18,47,13,23,25,16,14,9,32,12,15,16,9,7,8
2,6,27,12,32,14,25,10,13,11,24,7,16,9,9,5,9,7,2,5,24,19,17,22,21,18
3,28,13,10,11,9,11,24,13,19,22,22,11,21,18,16,11,24,7,22,9,23,10,23
4,13/
DATA ICFLOC /1,3,5,8,13,19,23,24,26,28,30,32,33,34,35,36,40,42,45,
149,51,54,57,59,64,67,69,71,72,74,75,78,84,86,89,93,95,97,99,103,10
25,107,109,111,112,113,114,118,120,124,126,130,132,134,136,139,140,
3142,144,146,147,149,150,151,152,155,158,161,164,167,170,174,176,17
48,180,182,184,187,189,192,195,198,200,203,206,208,210,213,214,217,
5219,222,224,227/
DATA ICFON1 /-184213676,1543503872,-225259652,2030043136,-21785408
14,1895448655,145227776,-266266598,977822304,-2137868103,-135079911
27,62914560,-266682549,1008470793,406341963,-164148918,974718726,37
32244480,-100622159,-1010518880,1612842506,1073741824,-174735360,-1
467562346,-1073741824,-200853612,-1073741824,-266682532,1358565552,
5-261460132,1342177280,-217766608,-244752384,-184217600,-266686464,
6-264207692,-959923574,1209402370,273613227,-224017137,545259520,-2
757767222,-1433902496,1074397184,-257767222,-1433902225,-2036030848
8,537001984,-133644182,1610612736,-88031128,1783244801,1048576,-896
903392,-1608382454,709386336,-255146715,0,-121454432,-2107086262,67
A1219744,1114139274,-1463812096,-94216064,-1563899222,671219744,-17
B4747820,1392508928,-174747820,1395720192,-134059840,-259354716,671
C08864,-234331456,-257767222,-1433055407,1342177280,-145258860,-182
D0109754,1196968266,1519957700,-1028616142,335939600,123512736,-261
E464064,210545320,-2046363542,1244135424,-90655036,-1028620222,3359
F39610,805306368,209492648,-1533906944,212660327,1872756736,2126621
G12,1610612736,-90655036,-1028620222,335939610,974103395,217082479,
H-1398800384,-217641136,1559480256,-266205688,684682412,217759850,0
I,217710592,207137952,211856384,-264207692/
DATA ICFON2 /-959923574,1209402370,272629760,210545320,-2046427136
1,-264207692,-959923574,1209402370,273638560,210545320,-2046386176,
2-267319286,709386848,-2136815158,-1342177280,-184168692,-140928614
34,-255839736,171622400,-255830774,1522532352,-255839741,86335314,1
4887478700,-1393505792,-255814299,257337772,-1408435712,0,-18869452
54,0,-256241664,-154482170,0,-265979360,-1610612736,-171483136,-244
6152182,1779409956,35684513,217084552,-1972754430,1048576,-92700032
7,1612843274,268435456,-99954777,-2010642942,545300736,-263566744,-
82105515998,134811648,1089602227,-976830715,1157627904,-89603392,-1
9604171702,1605018240,268500992,217084552,-1972764672,-184184997,15
A43503872,-137943807,1048576,217743434,0,-238894556,83886080,149975
B683,-2056974506,2022221472,149975688,-1972764672,-266313080,-19727
C54430,2097152,-268382453,747416230,-2078014208,-99954773,-19432709
D06,612672768,149963895,-1990197248,-250476534,675430498,-198741606
E4,-205318906,135868168,1744830464,-91615327,-2145385976,-260025078
F,1518338048,-260034045,86327122,1887478696,-1460631040,-87414783,2
G034694,612672768,-259358710,0,-137968204,-1804377004,890636032,-17
H1602092,1342177280,-205208138,-1770559914,890503936,-261979257,121
I2833792/
IS = IC - 32
IF ((IS.LT.1).OR.(IS.GT.94)) GO TO 60
ID = 0
IF ((IS.EQ.71).OR.(IS.EQ.74).OR.(IS.EQ.80).OR.(IS.EQ.81).OR.(IS.EQ
1.89)) ID = 4
MW = NW - 1
LWM = LW - 1
LWP = LW + 1
LEN = ICFLEN(IS)
LENW = (LEN - 1)/LW + 1
IOFF = ICFLOC(IS) - 1
IL = LW
MY = 0
IM = 0
CALL DMOVE(IX,IY,ICX,ICY)
C MAIN LOOP
DO 50 I = 1, LENW
IT = ICFONT(I+IOFF)
C IF (IT.LT.0) IT = 4294967296 + IT
LB(1) = IT
IF (LB(1).LT.0) LB(1) = LB(1) - MW
C DECODE COORDINATES
DO 10 J = 1, LWM
LB(J+1) = LB(J)/16
LB(J) = LB(J) - LB(J+1)*16
10 CONTINUE
IF (IT.LT.0) LB(LW) = LB(LW) + 8
IF (I.EQ.LENW) IL = LEN - (I - 1)*LW
C DRAW CHARACTER
DO 40 J = 1, IL
IT = LB(LWP-J)
IF (MY.EQ.1) GO TO 30
C X COORDINATE OR MOVE FLAG
IF (IT.EQ.15) GO TO 20
IT = SX*FLOAT(IT) + .5
JX = IX + IT
MY = 1
GO TO 40
20 IM = 1
GO TO 40
C Y COORDINATE
30 IT = SY*FLOAT(IT - ID) + .5
JY = IY + IT
IF (IM.EQ.0) CALL DLINE(G,CTYPE,BLANK,LX,LY,JX,JY,ICX,ICY,LWTYPE)
IF (IM.EQ.1) CALL DMOVE(JX,JY,ICX,ICY)
MY = 0
IM = 0
40 CONTINUE
50 CONTINUE
CALL DMOVE(IX,IY,ICX,ICY)
60 RETURN
END
*
*****************************************************
* DMOVE -- MOVES CURSOR
*****************************************************
*
SUBROUTINE DMOVE(I,J,ICX,ICY)
C THIS SUBROUTINE MOVES CURSOR TO (I,J)
ICX = I
ICY = J
RETURN
END
*
*****************************************************
* DLINE -- DRAWS LINE
*****************************************************
*
SUBROUTINE DLINE(G,CTYPE,BLANK,LX,LY,I,J,ICX,ICY,LWTYPE)
C THIS SUBROUTINE DRAWS LINE FROM (ICX,ICY) TO (I,J)
C WITH CTYPE CHARACTER
CHARACTER*1 G(LX,LY)
CHARACTER*1 CTYPE,BLANK
CHARACTER*1 XX
XX = CTYPE
IF (LWTYPE.LT.1) GO TO 60
II = I - ICX
JJ = J - ICY
KK = 1
AJI = 1.
ALWTYPE = .5*FLOAT(LWTYPE)
IF (IABS(JJ).GT.IABS(II)) GO TO 30
IF (II.LT.0) KK = -1
IF (II.NE.0) AJI = FLOAT(JJ)/FLOAT(II)
DO 20 N = 1, LWTYPE
AJ = FLOAT(ICY + N) - ALWTYPE
DO 10 L = ICX, I, KK
IF ((L.LT.0).OR.(L.GE.LX)) GO TO 10
M = AJI*FLOAT(L - ICX) + AJ
IF ((M.LT.0).OR.(M.GE.LY)) GO TO 10
IF (G(L+1,M+1).EQ.BLANK) G(L+1,M+1) = CTYPE
IF (G(L+1,M+1).NE.CTYPE) G(L+1,M+1) = XX
C IF (G(L+1,M+1).NE.CTYPE) G(L+1,M+1) = CHAR(IOR(ICHAR(G(L+1,M+1)),I
C 1CHAR(CTYPE)))
10 CONTINUE
20 CONTINUE
GO TO 60
30 IF (JJ.LT.0) KK = -1
AJI = FLOAT(II)/FLOAT(JJ)
DO 50 N = 1, LWTYPE
AI = FLOAT(ICX + N) - ALWTYPE
DO 40 M = ICY, J, KK
IF ((M.LT.0).OR.(M.GE.LY)) GO TO 40
L = AJI*FLOAT(M - ICY) + AI
IF ((L.LT.0).OR.(L.GE.LX)) GO TO 40
IF (G(L+1,M+1).EQ.BLANK) G(L+1,M+1) = CTYPE
IF (G(L+1,M+1).NE.CTYPE) G(L+1,M+1) = XX
C IF (G(L+1,M+1).NE.CTYPE) G(L+1,M+1) = CHAR(IOR(ICHAR(G(L+1,M+1)),I
C 1CHAR(CTYPE)))
40 CONTINUE
50 CONTINUE
60 ICX = I
ICY = J
RETURN
END
*
*****************************************************
* DPNT -- DRAWS POINT WITH CTYPE CHARACTER INTO G
*****************************************************
*
SUBROUTINE DPNT(G,CTYPE,BLANK,LX,LY,I,J,ICX,ICY,LWTYPE)
C THIS SUBROUTINE DRAWS POINT AT (I,J) WITH CTYPE CHARACTER
CHARACTER*1 G(LX,LY)
CHARACTER*1 CTYPE,BLANK
CHARACTER*1 XX
XX = CTYPE
IF (LWTYPE.LT.1) GO TO 30
IS = (LWTYPE + 1)/2
N1 = I - IS
K1 = J - IS
DO 20 K = 1, LWTYPE
M = K1 + K
IF ((M.LT.0).OR.(M.GE.LY)) GO TO 20
DO 10 N = 1, LWTYPE
L = N1 + N
IF ((L.LT.0).OR.(L.GE.LX)) GO TO 10
IF (G(L+1,M+1).EQ.BLANK) G(L+1,M+1) = CTYPE
IF (G(L+1,M+1).NE.CTYPE) G(L+1,M+1) = XX
C IF (G(L+1,M+1).NE.CTYPE) G(L+1,M+1) = CHAR(IOR(ICHAR(G(L+1,M+1)),I
C 1CHAR(CTYPE)))
10 CONTINUE
20 CONTINUE
30 ICX = I
ICY = J
RETURN
END
*
*****************************************************
* DASHLN -- DRAWS A DASHED LINE
*****************************************************
*
SUBROUTINE DASHLN(G,CTYPE,BLANK,LX,LY,I,J,ICX,ICY,L,LWTYPE)
C THIS SUBROUTINE DRAWS A DASHED LINE FROM (ICX,ICY) TO (I,J)
CHARACTER*1 G(LX,LY)
CHARACTER*1 CTYPE,BLANK
DIMENSION LT(4,4)
SAVE NS,NL,LTYPE
DATA LTYPE /0/
DATA LT /5,5,5,5,14,6,4,6,9,6,9,6,23,7,23,7/
IF ((L.EQ.LTYPE).OR.(L.LT.0).OR.(L.GT.7)) GO TO 10
LTYPE = L
IF ((LTYPE.EQ.0).OR.(LTYPE.GT.4)) GO TO 50
NS = 0
NL = LT(NS+1,LTYPE)
GO TO 20
10 IF ((LTYPE.EQ.0).OR.(LTYPE.GT.4)) GO TO 50
C SOFTWARE DASHED LINE
20 IX0 = ICX
IY0 = ICY
COST = FLOAT(I - ICX)
SINT = FLOAT(J - ICY)
ALEN = SQRT(COST*COST + SINT*SINT)
LEN = ALEN + .5
IF (NL.GE.LEN) GO TO 40
COST = COST/ALEN
SINT = SINT/ALEN
30 ANL = FLOAT(NL)
IX = FLOAT(ICX) + ANL*COST + .5
IY = FLOAT(ICY) + ANL*SINT + .5
IT = NS - (NS/2)*2
IF (IT.EQ.0) CALL DLINE(G,CTYPE,BLANK,LX,LY,IX,IY,IX0,IY0,LWTYPE)
IF (IT.EQ.1) CALL DMOVE(IX,IY,IX0,IY0)
NS = NS + 1
IF (NS.EQ.4) NS = 0
NL = NL + LT(NS+1,LTYPE)
IF (NL.LT.LEN) GO TO 30
40 IT = NS - (NS/2)*2
IF (IT.EQ.0) CALL DLINE(G,CTYPE,BLANK,LX,LY,I,J,IX0,IY0,LWTYPE)
IF (IT.EQ.1) CALL DMOVE(I,J,IX0,IY0)
NL = NL - LEN
IF (NL.GT.0) GO TO 60
NS = NS + 1
IF (NS.EQ.4) NS = 0
NL = LT(NS+1,LTYPE)
GO TO 60
C SOLID LINE
50 CALL DLINE(G,CTYPE,BLANK,LX,LY,I,J,ICX,ICY,LWTYPE)
60 ICX = I
ICY = J
RETURN
END
*
*****************************************************
* WIMAGE -- WRITES IMAGE (G) TO TERMINAL
*****************************************************
*
SUBROUTINE WIMAGE(G,LX,LY)
C THIS SUBROUTINE WRITES IMAGE TO TERMINAL
CHARACTER*1 G(LX,LY)
91 FORMAT (1H1,128A1)
92 FORMAT (1X,128A1)
LY1 = LY + 1
DO 10 K = 1, LY
K1 = LY1 - K
IF (K.EQ.1) WRITE (6,91) (G(J,K1),J=1,LX)
IF (K.GT.1) WRITE (6,92) (G(J,K1),J=1,LX)
10 CONTINUE
RETURN
END
*
*****************************************************
* CWRITE -- WRITES A CHARACTER INTO G
*****************************************************
*
SUBROUTINE CWRITE(G,C,LX,LY,IX,IY,ICX,ICY)
C THIS SUBROUTINE WRITES CHARACTER AT LOCATION (IX,IY)
CHARACTER*1 G(LX,LY)
CHARACTER*1 C
G(IX+1,IY+1) = C
ICX = IX
ICY = IY
RETURN
END
*
*****************************************************
* header -- writes header in movie file
*****************************************************
*
SUBROUTINE HEADER(IFRMT,LX,LY,NBIT)
C THIS SUBROUTINE WRITES HEADER IN MOVIE FILE
C IF IFRMT = 1,2,3 UCLA FORMAT HEADER = IFRMT, LX, LY, NBIT
C LX, LY IS THE SIZE OF THE IMAGE, AND NBIT IS THE NUMBER OF COLORS
C IF IFRMT = 4, MFE FORMAT HEADER = FRMT
C WHERE FRMT IS A 1 BYTE CHARACTER VARIABLE GIVEN BY:
C 241 FOR CGA, 242 FOR EGA, 243 FOR VGA
C IF IFRMT = 0, NO HEADER
CHARACTER*1 CHR(16)
DIMENSION IMGSIZ(4)
IF ((IFRMT.LT.1).OR.(IFRMT.GT.4)) GO TO 20
IF (IFRMT.EQ.4) GO TO 10
IMGSIZ(1) = IFRMT
IMGSIZ(2) = LX
IMGSIZ(3) = LY
IMGSIZ(4) = NBIT
C UCLA FORMAT HEADER
CALL CONVIC(IMGSIZ,CHR,16,4)
CALL BUFFWR(CHR,16,IFRMT)
GO TO 20
C MFE FORMAT HEADER
10 CHR(1) = CHAR(0)
IF ((LX.EQ.320).AND.(LY.EQ.200).AND.(NBIT.EQ.2)) CHR(1)=CHAR(241)
IF ((LX.EQ.640).AND.(LY.EQ.350).AND.(NBIT.EQ.1)) CHR(1)=CHAR(242)
IF ((LX.EQ.320).AND.(LY.EQ.200).AND.(NBIT.EQ.8)) CHR(1)=CHAR(243)
CALL BUFFWR(CHR,1,IFRMT)
20 RETURN
END
*
*****************************************************
* wrpal -- write palette for mve vga format files
*****************************************************
*
SUBROUTINE WRPAL(PAL,NPAL,IFRMT)
C THIS SUBROUTINE WRITES PALETTE FOR MFE VGA FORMAT FILES
CHARACTER*1 PAL(768)
CHARACTER*1 COLOR(24)
CHARACTER*1 CHR
DIMENSION ICOLOR(24)
SAVE ICOLOR
DATA ICOLOR /0,0,0,0,0,1,0,1,0,0,1,1,1,0,0,1,0,1,1,1,0,1,1,1/
IF (IFRMT.NE.4) GO TO 80
C WRITE DEFAULT PALETTE FOR VGA MODE
CHR = CHAR(240)
CALL BUFFWR(CHR,1,IFRMT)
IF (NPAL.GT.0) GO TO 40
DO 10 I = 1, 24
COLOR(I) = CHAR(63*ICOLOR(I))
10 CONTINUE
CALL BUFFWR(COLOR,24,IFRMT)
DO 20 I = 1, 24
COLOR(I) = CHAR(63)
20 CONTINUE
DO 30 I = 1, 31
CALL BUFFWR(COLOR,24,IFRMT)
30 CONTINUE
GO TO 80
C WRITE USER PALETTE FOR VGA MODE
40 LEN = 3*NPAL
IF (LEN.GT.768) LEN = 768
CALL BUFFWR(PAL,LEN,IFRMT)
IF (LEN.EQ.768) GO TO 80
C PAD PALETTE WITH WHITE
NL = (768 - LEN)
N = NL/24
NL = NL - 24*N
DO 50 I = 1, 24
COLOR(I) = CHAR(63)
50 CONTINUE
C write( 6,* ) ' n = ', n
IF (N.EQ.0) GO TO 70
DO 60 I = 1, N
CALL BUFFWR(COLOR,24,IFRMT)
60 CONTINUE
70 IF (NL.GT.0) CALL BUFFWR(COLOR,NL,IFRMT)
80 RETURN
END
*
*****************************************************
* GIMAGE -- COMPRESSES CHARACTER IMAGE DATA INTO CHARACTER DATA
*****************************************************
*
SUBROUTINE GIMAGE (G,IMAGE,LX,LY,LZ,NBIT,INTRL)
C THIS SUBROUTINE COMPRESSES CHARACTER IMAGE DATA INTO CHARACTER DATA
C NBIT = NUMBER OF BITS PER PIXEL
C LZ = (LX - 1)/NPIX + 1, WHERE NPIX = 8/NBIT
CHARACTER*1 G(LX,LY)
CHARACTER*1 BLANK
CHARACTER*1 IMAGE(LZ,LY)
C DATA BLANK /' '/
BLANK = CHAR(0)
NPIX = 8/NBIT
NTC = 2**NBIT
LY1 = LY + 1
LYH = (LY - 1)/2 + 1
DO 40 K = 1, LY
K1 = LY1 - K
K2 = K
K3 = (K - 1)/2
IF (INTRL.EQ.1) K2 = LYH*((K2 - 1) - 2*K3) + K3 + 1
DO 30 J = 1, LZ
J1 = (J - 1)*NPIX
ITC = 0
DO 20 I = 1, NPIX
IT = 0
J2 = J1 + I
IF (J2.GT.LX) GO TO 10
C IF (G(J2,K1).NE.BLANK) IT = 1
IS = ICHAR(G(J2,K1))
IT = IS - (IS/NTC)*NTC
10 ITC = NTC*ITC + IT
20 CONTINUE
IMAGE(J,K2) = CHAR(ITC)
30 CONTINUE
40 CONTINUE
RETURN
END
*
*****************************************************
* GRIMAGE -- COMPRESSES CHARACTER IMAGE DATA INTO CHARACTER DATA
* THIS ROUTINE COMPRESSES THE STUFF FROM G INTO IMAGE
*****************************************************
*
SUBROUTINE GRIMAGE (G,IMAGE,NX,NY,NXV,LX,LY,LZ,NBIT,INTRL,IREV)
C THIS SUBROUTINE COMPRESSES CHARACTER IMAGE DATA INTO CHARACTER DATA
C IF LX < NX OR LY < NY, THEN IMAGE IS TRUNCATED
C IF LX > NX OR LY > NY, THEN IMAGE IS PADDED WITH NULLS
C NBIT = NUMBER OF BITS PER PIXEL
C LZ = (LX - 1)/NPIX + 1, WHERE NPIX = 8/NBIT
C INTRL = (0,1) = (NO,YES) INTERLACE IMAGE
C IREV = (0,1) = (NO,YES) FLIP IMAGE VERTICALLY
CHARACTER*1 G(NXV,NY)
CHARACTER*1 BLANK
CHARACTER*1 IMAGE(LZ,LY)
C DATA BLANK /' '/
BLANK = CHAR(0)
NPIX = 8/NBIT
NTC = 2**NBIT
LY1 = LY + 1
LYH = (LY - 1)/2 + 1
IF (NY.LT.LY) LY1 = NY + 1
C LOOP OVER ROWS
DO 60 K = 1, LY
K1 = K
IF (IREV.EQ.1) K1 = LY1 - K
K2 = K
K3 = (K - 1)/2
IF (INTRL.EQ.1) K2 = LYH*((K2 - 1) - 2*K3) + K3 + 1
IF ((K1.LT.1).OR.(K1.GT.NY)) GO TO 40
C LOOP OVER COLUMNS
DO 30 J = 1, LZ
J1 = (J - 1)*NPIX
ITC = 0
C EXTRACT LOW ORDER NBITS FROM G ARRAY
DO 20 I = 1, NPIX
IT = 0
J2 = J1 + I
IF ((J2.GT.NX).OR.(J2.GT.LX)) GO TO 10
C IF (G(J2,K1).NE.BLANK) IT = 1
IS = ICHAR(G(J2,K1))
IT = IS - (IS/NTC)*NTC
10 ITC = NTC*ITC + IT
20 CONTINUE
IMAGE(J,K2) = CHAR(ITC)
30 CONTINUE
GO TO 60
C PAD Y VALUES WITH NULLS
40 ITC = 0
DO 50 J = 1, LZ
IMAGE(J,K2) = CHAR(ITC)
50 CONTINUE
60 CONTINUE
RETURN
END
*
*****************************************************
* PCTSAV -- COMPRESSES SUCCESSIVE IMAGES
*****************************************************
*
SUBROUTINE PCTSAV(IMAGE,JMAGE,IMG,LINE,LIMG,IXOR,LZ,LY,LENB,LENG,L
1ZG,IFRMT,INTRL)
C THIS SUBROUTINE PERFORMS COMPRESSION OF SUCCESSIVE IMAGES.
C INPUT IS IN ARRAY IMAGE, AND COMPRESSED OUTPUT IS IN ARRAY IMG.
C IF IXOR = 1, THEN THE CURRENT IMAGE IS XORED WITH THE PREVIOUS IMAGE
C BEFORE COMPRESSION, AND THE CURRENT IMAGE IS SAVE IN THE ARRAY JMAGE.
C LINE AND LIMG ARE SCRATCH ARRAYS NEEDED BY SUBROUTINE COMPRS
CHARACTER*1 IMAGE(LENB), JMAGE(LENB)
CHARACTER*1 IMG(LENG), LINE(LZ), LIMG(LZG)
CHARACTER*1 CHR(4)
91 FORMAT(36H COMPRESSED IMAGE OVERFLOW, IBMAX = ,I20,8H LENG = ,I20)
C COMPRESS IMAGE
IF (INTRL.EQ.1) GO TO 10
IF (IXOR.EQ.1) GO TO 20
IF (IFRMT.EQ.3) CALL COPYIM(IMAGE,IMG,LENB,LENG,IBMAX)
IF (IFRMT.NE.3) CALL COMPRS(IMAGE,IMG,LINE,LIMG,LZ,LY,LZ,LENB,LENG
1,LZG,IBMAX)
IF (IBMAX.GT.LENG) WRITE (6,91) IBMAX, LENG
GO TO 50
C INTERLACED IMAGE
10 LYH = LY/2
LYH1 = (LY - 1)/2 + 1
LEN = LZ*LYH1
CALL COMPRS(IMAGE,IMG,LINE,LIMG,LZ,LYH1,LZ,LEN,LENG,LZG,IBMAX)
IMG(IBMAX) = CHAR(240)
JBMAX = IBMAX
IT1 = LEN + 1
IT2 = IBMAX + 1
LEN = LZ*LYH
CALL COMPRS(IMAGE(IT1),IMG(IT2),LINE,LIMG,LZ,LYH,LZ,LEN,LENG,LZG,I
1BMAX)
IBMAX = IBMAX + JBMAX
IF (IBMAX.GT.LENG) WRITE (6,91) IBMAX, LENG
GO TO 60
C XOR AND COMPRESS SUCCESSIVE IMAGES
20 DO 30 I = 1, LENB
JMAGE(I) = CHAR(IEOR(ICHAR(IMAGE(I)),ICHAR(JMAGE(I))))
C JMAGE(I) = CHAR(ICHAR(IMAGE(I)).XOR.ICHAR(JMAGE(I)))
30 CONTINUE
IF (IFRMT.EQ.3) CALL COPYIM(JMAGE,IMG,LENB,LENG,IBMAX)
IF (IFRMT.NE.3) CALL COMPRS(JMAGE,IMG,LINE,LIMG,LZ,LY,LZ,LENB,LENG
1,LZG,IBMAX)
IF (IBMAX.GT.LENG) WRITE (6,91) IBMAX, LENG
C SAVE OLD IMAGE
DO 40 I = 1, LENB
JMAGE(I) = IMAGE(I)
40 CONTINUE
C WRITE COMPRESSED IMAGE TO DISK
50 IF (IFRMT.EQ.4) GO TO 60
CALL CONVIC(IBMAX,CHR,4,1)
CALL BUFFWR(CHR,4,IFRMT)
60 CALL BUFFWR(IMG,IBMAX,IFRMT)
RETURN
END
*
*****************************************************
* COPYIM -- MOVES CHARACTER DATA FROM IMAGE TO IMG
*****************************************************
*
SUBROUTINE COPYIM (IMAGE,IMG,LMAX,LMAXG,IB)
C THIS SUBROUTINE MOVES CHARACTER DATA FROM ARRAY IMAGE TO IMG
CHARACTER*1 IMAGE(LMAX), IMG(LMAXG)
IB = LMAX
DO 10 I = 1, IB
IMG(I) = IMAGE(I)
10 CONTINUE
RETURN
END
*
*****************************************************
* COMPRS -- COMPRESSES BINARY DATA
*****************************************************
*
SUBROUTINE COMPRS (IMAGE,IMG,LINE,LIMG,LENL,NUML,LENV,LMAX,LMAXG,L
1ENLG,IB)
C THIS SUBROUTINE COMPRESSES BINARY DATA, USING THE ALGORITHM
C BY R. H. FROBOSE, JR., LAWRENCE LIVERMORE LAB REPORT UCRL-51858
C WRITTEN BY VIKTOR K. DECYK, UCLA
C INPUT IS IN ARRAY IMAGE, OF SIZE LMAX = LENV*NUML, WHERE
C LENV = SPACING BETWEEN ROWS IN BYTES, NUML = NUMBER OF LINES
C LENL = LENGTH OF LINE IN BYTES
C OUTPUT IS IN ARRAY IMG, OF MAXIMUM SIZE LMAXG = LMAX+(LMAX-1)/3+1,
C AND ACTUAL SIZE GIVEN IN VARIABLE IB
C LINE AND LIMG ARE SCRATCH ARRAYS, OF SIZE LENL AND LENLG RESPECTIVELY,
C WHERE LENLG = LENL+(LENL-1)/3+1
CHARACTER*1 IMAGE(LMAX), IMG(LMAXG), LINE(LENL), LIMG(LENLG)
INTEGER IC0,IC1,IC2,IC3
SAVE ICN,IC0,IC1,IC2,IC3,ISTYLE
DATA ICN,IC0,IC1,IC2,IC3 /64,0,64,128,192/
C ISTYLE = (0,1,2) = (NO XOR,XOR,BOTH) SUCCESSIVE LINES
DATA ISTYLE /2/
ICNR = ICN/2 - 2
C PREVENT XOR ON FIRST LINE
IB = LMAX
IB0 = 0
IL = 0
GO TO 120
10 IF (IXOR.EQ.1) GO TO 100
IF ((ISTYLE.GT.0).AND.(LIB.GT.(IB-IB0))) GO TO 30
C XORED LINE IS LONGER
DO 20 J = 1, LIB
IMG(J+IB0) = LIMG(J)
20 CONTINUE
IB = IB0 + LIB
C START NEW LINE
30 IL = IL + LENV
IF (IL.GE.LMAX) GO TO 450
C LOOKING FOR IDENTICAL LINES
IRL = 0
IL1 = IL - LENV
I = 0
40 IF (I.EQ.LENL) GO TO 50
I = I + 1
IF (IMAGE(I+IL).EQ.IMAGE(I+IL1)) GO TO 40
C LINE NOT IDENTICAL
IF (IRL.EQ.0) GO TO 60
C REPEAT PREVIOUS LINE IRL TIMES. DIFFERENT LINE FOLLOWS.
IB = IB + 1
ITC = IC3 + IRL
IMG(IB) = CHAR(ITC)
GO TO 60
C LINE IDENTICAL
50 IRL = IRL + 1
IL = IL + LENV
I = 0
IF ((IL.LT.LMAX).AND.(IRL.LT.ICNR)) GO TO 40
C REPEAT PREVIOUS LINE IRL TIMES. BUFFER FULL.
IB = IB + 1
ITC = IC3 + IRL
IMG(IB) = CHAR(ITC)
IF (IL.GE.LMAX) GO TO 450
IRL = 0
I = 0
GO TO 40
C TEST WHETHER TO SKIP XOR
60 IB0 = IB
IF (ISTYLE.EQ.0) GO TO 120
C XOR CURRENT LINE
IL1 = IL - LENV
DO 70 I = 1, LENL
LINE(I) = CHAR(IEOR(ICHAR(IMAGE(I+IL)),ICHAR(IMAGE(I+IL1))))
C LINE(I) = CHAR(ICHAR(IMAGE(I+IL)).XOR.ICHAR(IMAGE(I+IL1)))
70 CONTINUE
LIB = 1
ITC = IC3 + ICNR + 1
LIMG(LIB) = CHAR(ITC)
IXOR = 1
GO TO 140
C SECOND PASS
C SAVE PREVIOUS COMPRESSED LINE
100 DO 110 J = 1, LIB
IMG(J+IB) = LIMG(J)
110 CONTINUE
IB = IB + LIB
C TEST WHETHER TO PERFORM XOR
IF (ISTYLE.EQ.1) GO TO 30
120 DO 130 I = 1, LENL
LINE(I) = IMAGE(I+IL)
130 CONTINUE
LIB = 0
IXOR = 0
140 I = 1
IZ = 0
ID = 0
150 IF (LINE(I).EQ.CHAR(0)) GO TO 400
C NON-ZERO BYTES
C LOOKING FOR DIFFERENT BYTES
200 ID = ID + 1
IF (I.EQ.LENL) GO TO 260
IF (ID.EQ.ICN) GO TO 240
I = I + 1
IF (LINE(I).NE.CHAR(0)) GO TO 205
IF ((I.EQ.LENL).OR.(LINE(I+1).NE.CHAR(0))) GO TO 200
GO TO 220
205 IF (LINE(I).NE.LINE(I-1)) GO TO 200
IF (ID.EQ.1) GO TO 300
IF ((I.EQ.LENL).OR.(LINE(I+1).NE.LINE(I))) GO TO 200
ID = ID - 1
C PLOT NEXT ID BYTES AS THEY APPEAR. PAIR FOLLOWS.
LIB = LIB + 1
ITC = IC2 + ID - 1
LIMG(LIB) = CHAR(ITC)
I1 = (I - ID - 2)
DO 210 J = 1, ID
LIMG(J+LIB) = LINE(J+I1)
210 CONTINUE
LIB = LIB + ID
GO TO 300
C PLOT NEXT ID BYTES AS THEY APPEAR. ZERO FOLLOWS.
220 LIB = LIB + 1
ITC = IC2 + ID - 1
LIMG(LIB) = CHAR(ITC)
I1 = (I - ID - 1)
DO 230 J = 1, ID
LIMG(J+LIB) = LINE(J+I1)
230 CONTINUE
LIB = LIB + ID
ID = 0
GO TO 400
C PLOT NEXT ID BYTES AS THEY APPEAR. BUFFER FULL.
240 LIB = LIB + 1
ITC = IC2 + ID - 1
LIMG(LIB) = CHAR(ITC)
I1 = (I - ID)
DO 250 J = 1, ID
LIMG(J+LIB) = LINE(J+I1)
250 CONTINUE
LIB = LIB + ID
I = I + 1
ID = 0
GO TO 150
C PLOT NEXT ID BYTES AS THEY APPEAR. LINE FULL.
260 LIB = LIB + 1
ITC = IC2 + ID - 1
LIMG(LIB) = CHAR(ITC)
I1 = (I - ID)
DO 270 J = 1, ID
LIMG(J+LIB) = LINE(J+I1)
270 CONTINUE
LIB = LIB + ID
GO TO 10
C NON-ZERO BYTES
C LOOKING FOR IDENTICAL BYTES
300 IR = 1
310 IR = IR + 1
IF (I.EQ.LENL) GO TO 330
IF (IR.EQ.ICN) GO TO 320
I = I + 1
IF (LINE(I).EQ.LINE(I-1)) GO TO 310
C REPEAT NEXT BYTE IR TIMES. DIFFERENT BYTE FOLLOWS.
LIB = LIB + 1
ITC = IC0 + IR - 1
LIMG(LIB) = CHAR(ITC)
LIB = LIB + 1
LIMG(LIB) = LINE(I-1)
ID = 0
GO TO 150
C REPEAT NEXT BYTE IR TIMES. BUFFER FULL.
320 LIB = LIB + 1
ITC = IC0 + IR - 1
LIMG(LIB) = CHAR(ITC)
LIB = LIB + 1
LIMG(LIB) = LINE(I)
I = I + 1
ID = 0
GO TO 150
C REPEAT NEXT BYTE IR TIMES. LINE FULL.
330 LIB = LIB + 1
ITC = IC0 + IR - 1
LIMG(LIB) = CHAR(ITC)
LIB = LIB + 1
LIMG(LIB) = LINE(I)
GO TO 10
C ZERO BYTES
400 IZ = IZ + 1
IF (I.EQ.LENL) GO TO 430
I = I + 1
IF (LINE(I).EQ.CHAR(0)) GO TO 400
410 IF (IZ.LE.ICN) GO TO 420
C SKIP NEXT IZ BYTES, AND PLOT THE FOLLOWING BYTE. BUFFER FULL.
LIB = LIB + 1
ITC = IC1 + ICN - 1
LIMG(LIB) = CHAR(ITC)
LIB = LIB + 1
LIMG(LIB) = CHAR(0)
IZ = IZ - (ICN + 1)
IF (IZ.EQ.0) GO TO 200
GO TO 410
C SKIP NEXT IZ BYTES, AND PLOT THE FOLLOWING BYTE. NEXT BYTE NON-ZERO.
420 LIB = LIB + 1
ITC = IC1 + IZ - 1
LIMG(LIB) = CHAR(ITC)
LIB = LIB + 1
LIMG(LIB) = LINE(I)
IF (I.EQ.LENL) GO TO 10
I = I + 1
IZ = 0
GO TO 150
C PLOT END-OF-LINE SENTINEL
430 LIB = LIB + 1
LIMG(LIB) = CHAR(IC3)
GO TO 10
C END-OF-FRAME BYTE
450 IB = IB + 1
IMG(IB) = CHAR(0)
RETURN
END
*
*****************************************************
* BUFFWR -- PACKS IMAGE INTO BUFFER AND WRITES WHEN FULL
*****************************************************
*
SUBROUTINE BUFFWR(LINE,N,IFRMT)
C THIS SUBROUTINE PACKS IMAGE DATA INTO BUFFER AND WRITES WHEN FULL
C INPUT IS IN CHARACTER ARRAY LINE, AND N CHARACTERS ARE TO BE WRITTEN
CHARACTER*1 C0
CHARACTER*1 LINE(*)
CHARACTER*1 LOUT(80)
DIMENSION IOUT(20)
SAVE LEN,LMAX,LW,LOUT
DATA LEN,LMAX,LW /0,80,4/
L = (LMAX - 1)/LW + 1
NC = N
NCR = N
I = 0
IF (N.GT.0) GO TO 10
IF (LEN.GE.0) GO TO 60
GO TO 70
10 NCR = (NC + LEN) - LMAX
IF (NCR.GE.0) NC = LMAX - LEN
20 IF (LEN.GT.0) GO TO 40
C C0 = CHAR(0)
C0 = CHAR(232)
DO 30 J = 1, LMAX
LOUT(J) = C0
30 CONTINUE
40 DO 50 J = 1, NC
LOUT(J+LEN) = LINE(I+J)
50 CONTINUE
I = I + NC
LEN = LEN + NC
IF (NCR.LT.0) GO TO 70
60 ITC = LEN
IF (IFRMT.EQ.4) ITC = LMAX
IF (LEN.GT.0) CALL PCTOUT(LOUT,IOUT,ITC,L,IFRMT)
LEN = 0
IF (N.EQ.0) CALL PCTOUT(LOUT,IOUT,LEN,L,IFRMT)
IF (NCR.EQ.0) GO TO 70
NC = NCR
NCR = NCR - LMAX
IF (NCR.GE.0) NC = LMAX
GO TO 20
70 RETURN
END
*
*****************************************************
* PCTOUT -- WRITES COMPRESSED RASTER FILE IN APPROP FORM
*****************************************************
*
SUBROUTINE PCTOUT(LOUT,IOUT,LEN,N,IFRMT)
C THIS SUBROUTINE WRITES COMPRESSED RASTER FILE IN APPROPRIATE FORM
CHARACTER*1 LOUT(*)
DIMENSION IOUT(N)
91 FORMAT (80A1)
C IFRMT = 2 = ENCRYPT THE FILE
IF (IFRMT.EQ.2) GO TO 10
IF (LEN.GT.0) WRITE (19,91) (LOUT(J),J=1,LEN)
GO TO 20
10 CALL CONVCI(LOUT,IOUT,LEN,N)
CALL ENCODE(IOUT,LEN)
20 RETURN
END
*
*****************************************************
* CONVIC -- CONVERTS PACKED INTEGER TO CHARACTER DATA
*****************************************************
*
SUBROUTINE CONVIC(LIN,CHR,LEN,N)
C THIS SUBROUTINE CONVERTS PACKED INTEGER TO CHARACTER DATA
C SHOULD HAVE N = (LEN - 1)/LW + 1
C DIMENSION LB(LW)
C MW = -2**(8*LW-1)
CHARACTER*1 CHR(LEN)
DIMENSION LIN(N)
DIMENSION LB(4)
SAVE LW,NW
DATA LW,NW /4,-2147483647/
IF (LEN.LT.1) GO TO 70
MW = NW - 1
L = (LEN - 1)/LW + 1
M = LEN/LW
MR = LEN - M*LW
LWM = LW - 1
LWP = LW + 1
IF (M.EQ.0) GO TO 40
DO 30 I = 1, M
I1 = (I - 1)*LW
LB(1) = LIN(I)
IF (LB(1).LT.0) LB(1) = LB(1) - MW
DO 10 J = 1, LWM
LB(J+1) = LB(J)/256
LB(J) = LB(J) - LB(J+1)*256
10 CONTINUE
IF (LIN(I).LT.0) LB(LW) = LB(LW) + 128
DO 20 J = 1, LW
CHR(I1 + J) = CHAR(LB(LWP - J))
20 CONTINUE
30 CONTINUE
40 IF (MR.EQ.0) GO TO 70
I1 = M*LW
LB(1) = LIN(L)
IF (LB(1).LT.0) LB(1) = LB(1) - MW
DO 50 J = 1, LWM
LB(J+1) = LB(J)/256
LB(J) = LB(J) - LB(J+1)*256
50 CONTINUE
IF (LIN(L).LT.0) LB(LW) = LB(LW) + 128
DO 60 J = 1, MR
CHR(I1 + J) = CHAR(LB(LWP - J))
60 CONTINUE
70 RETURN
END
*
*****************************************************
* CONVCI -- CONVERTS CHARACTER DATA TO PACKED INTEGER
*****************************************************
*
SUBROUTINE CONVCI(CHR,LOUT,LEN,N)
C THIS SUBROUTINE CONVERTS CHARACTER DATA TO PACKED INTEGER
C SHOULD HAVE N = (LEN - 1)/LW + 1
CHARACTER*1 CHR(*)
DIMENSION LOUT(N)
SAVE LW,NW
DATA LW,NW /4,-2147483647/
IF (LEN.LT.1) GO TO 60
MW = NW - 1
L = (LEN - 1)/LW + 1
M = LEN/LW
MR = LEN - M*LW
LW1 = LW - 1
IF (M.EQ.0) GO TO 30
DO 20 J = 1, M
J1 = (J - 1)*LW + 1
ITC = ICHAR(CHR(J1))
LOUT(J) = ITC
IF (ITC.GE.128) LOUT(J) = LOUT(J) - 128
DO 10 I = 1, LW1
LOUT(J) = ICHAR(CHR(J1+I)) + 256*LOUT(J)
10 CONTINUE
IF (ITC.GE.128) LOUT(J) = LOUT(J) + MW
20 CONTINUE
30 IF (MR.EQ.0) GO TO 60
J1 = M*LW + 1
ITC = ICHAR(CHR(J1))
LOUT(L) = ITC
IF (ITC.GE.128) LOUT(L) = LOUT(L) - 128
IF (MR.EQ.1) GO TO 50
MR1 = MR - 1
DO 40 I = 1, MR1
LOUT(L) = ICHAR(CHR(J1+I)) + 256*LOUT(L)
40 CONTINUE
50 IT1 = 256**(LW*L - LEN)
LOUT(L) = IT1*LOUT(L)
IF (ITC.GE.128) LOUT(L) = LOUT(L) + MW
60 RETURN
END
*
*****************************************************
* ENCODE -- ENCODES BINARY TO ASCII
*****************************************************
*
SUBROUTINE ENCODE (LIN,LEN)
C THIS SUBROUTINE ENCODES BINARY TO ASCII
C WRITTEN FOR THE IBM 3090 VF - VIKTOR K. DECYK, UCLA
C DIMENSION LB(LW), IA(IB+1), LA > = 64
C MW = -2**(8*LW-1)
DIMENSION LIN(1)
DIMENSION LB(4), IA(4)
SAVE LW,NW,IB,LA,IS,IA,K
DATA LW,NW,IB,LA,IS,K /4,-2147483647,3,83,34,1/
IF (LEN.LT.1) GO TO 70
MW = NW - 1
L = (LEN - 1)/LW + 1
LWM = LW - 1
LWP = LW + 1
IC = IB + 1
LS = 256**(LW - IC)
DO 60 I = 1, L
LB(1) = LIN(I)
IF (LB(1).LT.0) LB(1) = LB(1) - MW
DO 10 J = 1, LWM
LB(J+1) = LB(J)/256
LB(J) = LB(J) - LB(J+1)*256
10 CONTINUE
IF (LIN(I).LT.0) LB(LW) = LB(LW) + 128
DO 50 J = 1, LW
IA(K) = LB(LWP - J)
II = IA(K)
C IF (II.EQ.0) GO TO 50
K = K + 1
IF (K.LE.IB) GO TO 50
LINE = 0
DO 20 JJ = 1, IB
LINE = IA(JJ) + 256*LINE
20 CONTINUE
IA(IC) = LINE
DO 30 JJ = 1, IB
J1 = IC - JJ
IA(J1) = IA(J1+1)/LA
IA(J1+1) = IA(J1+1) - IA(J1)*LA
30 CONTINUE
LINE = 0
DO 40 JJ = 1, IC
IA(JJ) = IA(JJ) + IS
IF (IA(JJ).GT.90) IA(JJ) = IA(JJ) + 6
LINE = IA(JJ) + 256*LINE
40 CONTINUE
LINE = LS*LINE
CALL BUFFPK (LINE,IC)
K = 1
50 CONTINUE
60 CONTINUE
GO TO 120
70 IC = K - 1
IF (IC.LT.1) GO TO 110
LINE = 0
DO 80 JJ = 1, IC
LINE = IA(JJ) + 256*LINE
80 CONTINUE
IC1 = IC + 1
IA(IC1) = LINE
DO 90 JJ = 1, IC
J1 = IC1 - JJ
IA(J1) = IA(J1+1)/LA
IA(J1+1) = IA(J1+1) - IA(J1)*LA
90 CONTINUE
LINE = 0
DO 100 JJ = 1, IC1
IA(JJ) = IA(JJ) + IS
IF (IA(JJ).GT.90) IA(JJ) = IA(JJ) + 6
LINE = IA(JJ) + 256*LINE
100 CONTINUE
LINE = LINE*256**(LW - IC1)
CALL BUFFPK (LINE,IC1)
K = 1
IC = 0
110 CALL BUFFPK (LINE,IC)
120 RETURN
END
*
*****************************************************
* BUFFPK
*****************************************************
*
SUBROUTINE BUFFPK(LINE,N)
C DIMENSION LOUT((LMAX-1)/LW+2)
DIMENSION LINE(1)
DIMENSION LOUT(19)
SAVE LEN,LMAX,LW,LOUT
DATA LEN,LMAX,LW /0,72,4/
DATA LOUT(1) /0/
NC = N
NCR = N
IF (N.GT.0) GO TO 10
IF (LEN.GT.0) GO TO 50
GO TO 70
10 NCR = (NC + LEN) - LMAX
IF (NCR.GE.0) NC = LMAX - LEN
M = LEN/LW
L = LEN - LW*M
LR = LW - L
LS = 256**L
LL = 1
IF (L.GT.0) LL = 256**LR
NCT = NC
I = 1
20 LT = LINE(I)/LS
LOUT(M+I) = LOUT(M+I) + LT
IF (NCT.LT.LR) GO TO 40
LOUT(M+I+1) = (LINE(I) - LS*LT)*LL
30 IF (NCT.LE.LW) GO TO 40
I = I + 1
NCT = NCT - LW
GO TO 20
40 LEN = LEN + NC
IF (NCR.LT.0) GO TO 70
50 CALL TPUTC(LOUT,LEN)
LEN = 0
IF (NCR.EQ.0) GO TO 60
NC = NCR
NCR = NCR - LMAX
IF (NCR.GE.0) NC = LMAX
LOUT(1) = LOUT(M+I+1)
M = -I
NCT = NCT + NC
GO TO 30
60 LOUT(1) = 0
70 RETURN
END
*
*****************************************************
* TPUTC -- TRANSLATES ASCII TO EBCDIC
*****************************************************
*
SUBROUTINE TPUTC(LOUT,LEN)
C THIS SUBROUTINE TRANSLATES ASCII TO EBCDIC ACCORDING TO THE
C CONVENTIONS AT CORNELL CNSF'S IBM 3090VF AND WRITES RESULT TO METAFILE
C VIKTOR K. DECYK, UCLA
C DIMENSION LB(LW)
C MW = -2**(8*LW-1)
DIMENSION LOUT(1)
DIMENSION IATE(128), LB(4)
SAVE LW,NW,IATE
91 FORMAT (18A4)
DATA LW,NW /4,-2147483647/
C EBCDIC CODE FOR ASCII 124 IS NON-STANDARD
DATA IATE /0,1,2,3,55,45,46,47,22,5,37,11,12,13,14,15,16,17,18,19,
160,61,50,38,24,25,63,39,34,29,53,31,64,90,127,123,91,108,80,125,77
2,93,92,78,107,96,75,97,240,241,242,243,244,245,246,247,248,249,122
3,94,76,126,110,111,124,193,194,195,196,197,198,199,200,201,209,210
4,211,212,213,214,215,216,217,226,227,228,229,230,231,232,233,173,2
524,189,95,109,121,129,130,131,132,133,134,135,136,137,145,146,147,
6148,149,150,151,152,153,162,163,164,165,166,167,168,169,192,79,208
7,161,7/
IF (LEN.LT.1) GO TO 40
MW = NW - 1
L = (LEN - 1)/LW + 1
LW1 = LW - 1
DO 30 I = 1, L
LB(1) = LOUT(I)
DO 10 J = 1, LW1
LB(J+1) = LB(J)/256
LB(J) = LB(J) - LB(J+1)*256
10 CONTINUE
IT1 = IATE(LB(LW)+1)
IT2 = IT1
IF (IT1.GE.128) IT1 = IT1 - 128
DO 20 J = 1, LW1
IT1 = IATE(LB(LW-J)+1) + 256*IT1
20 CONTINUE
LOUT(I) = IT1
IF (IT2.GE.128) LOUT(I) = LOUT(I) + MW
30 CONTINUE
WRITE (19,91) (LOUT(J),J=1,L)
40 RETURN
END
*
*****************************************************
* startg -- initializes compressed raster device
*****************************************************
*
SUBROUTINE STARTG
C THIS SUBROUTINE INITIALIZES COMPRESSED RASTER DEVICE
COMMON /GRDEV/ LX, LY, NBIT, IFRMT, INTRL, IXOR
CHARACTER*1 C
DIMENSION LXS(7), LYS(7), NBITS(4)
SAVE LXS,LYS,NBITS,ISTART
91 FORMAT (61H ENTER (1,2,3,4) FOR (COMPRESSED,ENCODED,BINARY,MFE) FO
1RMAT: )
92 FORMAT (A1)
93 FORMAT (75H ENTER (1,2,3,4,5,6,7) FOR (MACPLUS,MACII,CGA,EGA,3179G
1,ASCII,OTHER) SIZE: )
94 FORMAT (33H ENTER IMAGE SIZE AS LX,LY PAIR: )
95 FORMAT (42H ENTER (1,2,3,4) FOR (2,4,16,256) COLORS: )
96 FORMAT (39H ENTER (1,2,3) FOR (CGA,EGA,VGA) SIZE: )
97 FORMAT (18H PROGRAM EXECUTING)
DATA LXS /512,640,320,640,720,79,1024/
DATA LYS /342,480,200,350,384,21,781/
DATA NBITS /1,2,4,8/
DATA ISTART /0/
IF (ISTART.NE.0) GO TO 90
INTRL = 0
IXOR = 1
NPAL = 1
C INQUIRE FORMAT TYPE
10 C = '4'
C WRITE (6,91)
C READ (5,92,END=15) C
15 IFRMT = ICHAR(C) - ICHAR('0')
IF (IFRMT.EQ.0) GO TO 80
IF ((IFRMT.LT.1).OR.(IFRMT.GT.4)) GO TO 10
IF (IFRMT.EQ.4) GO TO 60
IF (IFRMT.NE.2) GO TO 20
C CLOSE(UNIT=10)
C OPEN(UNIT=10,FILE='MOVIEF',FORM='FORMATTED',STATUS='UNKNOWN')
C NOT MFE FORMAT
C FIRST, INQUIRE SCREEN SIZE
20 continue
C 20 WRITE (6,93)
READ (5,92,END=25) C
25 ID = ICHAR(C) - ICHAR('0')
IF (ID.EQ.0) GO TO 80
IF ((ID.LT.1).OR.(ID.GT.7)) GO TO 20
LX = LXS(ID)
LY = LYS(ID)
IF (ID.LT.7) GO TO 40
C VARIABLE SCREEN SIZE
30 continue
C 30 WRITE (6,94)
READ (5,*,END=35) LX, LY
35 IF ((LX.LT.1).OR.(LX.GT.LXS(7))) GO TO 30
IF ((LY.LT.1).OR.(LY.GT.LYS(7))) GO TO 30
C NEXT, INQUIRE NUMBER OF COLOR BITS
40 continue
C 40 WRITE (6,95)
READ (5,92,END=45) C
45 ID = ICHAR(C) - ICHAR('0')
IF (ID.EQ.0) GO TO 80
IF ((ID.LT.1).OR.(ID.GT.4)) GO TO 40
NBIT = NBITS(ID)
GO TO 70
C MFE FORMAT
60 continue
C 60 WRITE (6,96)
READ (5,92,END=65) C
65 ID = ICHAR(C) - ICHAR('0')
IF (ID.EQ.0) GO TO 80
IF ((ID.LT.1).OR.(ID.GT.3)) GO TO 60
IF (ID.EQ.1) NBIT = 2
IF (ID.EQ.2) NBIT = 1
IF (ID.EQ.3) NBIT = 8
IF (ID.EQ.1) INTRL = 1
IF (ID.EQ.3) NPAL = 0
IF (ID.LT.3) ID = ID + 2
LX = LXS(ID)
LY = LYS(ID)
70 IF ((IFRMT.EQ.1).OR.(IFRMT.EQ.2)) IXOR = 1
IF ((IFRMT.EQ.3).OR.(IFRMT.EQ.4)) IXOR = 0
CALL HEADER(IFRMT,LX,LY,NBIT)
IF (NPAL.EQ.0) CALL WRPAL(C,NPAL,IFRMT)
ISTART = 1
GO TO 90
80 STOP 1
90 WRITE (6,97)
END
*
*****************************************************
* GRPARM -- INITIALIZES GRAPHICS SIZE PARAMETERS
*****************************************************
*
SUBROUTINE GRPARM(IPARM,IRX,IRY,MNX,MNY,LNX,LNY,ICH,ICW,ISLB,ISTCX
1,ISTCY,NTCX,NTCY,IGSTYL)
C THIS SUBROUTINE INITIALIZES GRAPHICS SIZE PARAMETERS
C IPARM = (1,2) = PARAMETERS FOR (LINE,CONTOUR) PLOTS
COMMON /GRDEV/ LX, LY, NBIT, IFRMT, INTRL, IXOR
IF (IPARM.LE.0) GO TO 40
IRX = LX
IRY = LY
XS = FLOAT(LX)/1024.
YS = FLOAT(LY)/780.
ICH = 26.*YS + .5
ICW = 18.*XS + .5
IGSTYL = 1
IF (IPARM.GT.1) GO TO 20
C PARAMETERS FOR LINE PLOTS
MNX = 225.*XS + .5
MNY = 115.*YS + .5
LNX = 785.*XS + .5
LNY = 650.*YS + .5
ISLB = 225.*XS + .5
ISTCX = 10.*XS + .5
ISTCY = 10.*YS + .5
NTCX = 10
NTCY = 10
GO TO 40
20 IF (IPARM.GT.2) GO TO 30
C PARAMETERS FOR CONTOUR PLOTS
MNX = 225.*XS + .5
MNY = 80.*YS + .5
LNX = 690.*XS + .5
LNY = 690.*YS + .5
ISLB = 225.*XS + .5
ISTCX = 0
ISTCY = 0
NTCX = 1
NTCY = 1
GO TO 40
30 IF (IPARM.GT.3) GO TO 40
C PARAMETERS FOR TEXT PLOTS
MNX = 0
MNY = 0
LNX = LX - 1
LNY = LY - 1
ISLB = 0
ISTCX = 0
ISTCY = 0
NTCX = 1
NTCY = 1
* **************************************************
* WHAT ABOUT PARAMETERS FOR RASTER IMAGES???
* WHAT SHOULD THESE BE??????
* **************************************************
40 RETURN
END
*
*****************************************************
* DRAWG -- GENERIC DRAW ROUTINE
*****************************************************
*
*
*****************************************************
* drawg -- generic draw routine
*****************************************************
*
SUBROUTINE DRAWG(C,X,Y,IC,LWTYPE,L,ICODE)
C THIS SUBROUTINES IS A GENERIC DRAW ROUTINE
C IF ICODE = 0 ZEROES IMAGE
C IF ICODE = 1 PERFORMS MOVE
C IF ICODE = 2 DRAWS LINE
C IF ICODE = 3 DRAWS POINT
C IF ICODE = 4 DRAWS DASHED LINE
C IF ICODE = 5 WRITES CHARACTERS
C IF ICODE = 6 DRAWS IMAGE
C LX = NUMBER OF PIXELS IN X, LY = NUMBER OF PIXELS IN Y
C NBIT = NUMBER OF BITS PER PIXEL, NBIT < 9
PARAMETER(LXM=1024,LYM=781,NBITD=8)
PARAMETER(NPIXD=8/NBITD,LZM=(LXM-1)/NPIXD+1,LENBM=LZM*LYM)
PARAMETER(LENGM=LENBM+LZM,LZGM=LZM+1)
COMMON /GRDEV/ LX, LY, NBIT, IFRMT, INTRL, IXOR
COMMON /RCOM/ MINX,LENX,MINY,LENY,ICX,ICY,
1XMIN,XMAX,YMIN,YMAX,DX,DY,CSX,CSY
CHARACTER*1 C
CHARACTER*1 BLANK
CHARACTER*1 G(LXM*LYM)
CHARACTER*1 IMAGE(LENBM), JMAGE(LENBM)
CHARACTER*1 IMG(LENGM), LINE(LZM), LIMG(LZGM)
CHARACTER*1 CTYPE
DIMENSION ICOLOR(16), ITWOBC(16)
DIMENSION IETA(256)
SAVE ISTART,ICC,G,CTYPE,BLANK,ICOLOR,ITWOBC,IETA
SAVE LZ,LENB,LENG,LZG,JMAGE
91 FORMAT (24H SIZE ERROR, LXM, LYM = ,2I12,10H LX, LY = ,2I12)
DATA ISTART,ICC /0,-1/
C COLOR TABLE FOR 4 BIT COLOR
DATA ICOLOR /0,1,2,3,4,5,6,7,1,1,2,3,4,5,6,7/
C COLOR TABLE FOR 2 BIT COLOR
DATA ITWOBC /0,1,1,1,2,2,3,3,1,1,1,1,2,2,3,3/
C EBCDIC/ASCII TRANSLATION WITH CONVENTIONS AT CORNELL CNSF IBM 3090VF.
C ASCII CODES FOR EBCDIC 74,79,113,139,155 ARE NON-STANDARD
C EBCDIC CODES 28,30,106 ARE ADDED FOR IBM COMPATIBILITY
DATA IETA /0,1,2,3,-1,9,-1,127,-1,-1,-1,11,12,13,14,15,16,17,18,19
1,-1,-1,8,-1,24,25,-1,-1,28,29,30,31,-1,-1,28,-1,-1,10,23,27,-1,-1,
2-1,-1,-1,5,6,7,-1,-1,22,-1,-1,30,-1,4,-1,-1,-1,-1,20,21,-1,26,32,-
31,-1,-1,-1,-1,-1,-1,-1,-1,92,46,60,40,43,124,38,-1,-1,-1,-1,-1,-1,
4-1,-1,-1,33,36,42,41,59,94,45,47,-1,-1,-1,-1,-1,-1,-1,-1,124,44,37
5,95,62,63,-1,94,-1,-1,-1,-1,-1,-1,-1,96,58,35,64,39,61,34,-1,97,98
6,99,100,101,102,103,104,105,-1,123,-1,-1,-1,-1,-1,106,107,108,109,
7110,111,112,113,114,-1,125,-1,-1,-1,-1,-1,126,115,116,117,118,119,
8120,121,122,-1,-1,-1,91,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
9-1,93,-1,-1,123,65,66,67,68,69,70,71,72,73,-1,-1,-1,-1,-1,-1,125,7
A4,75,76,77,78,79,80,81,82,-1,-1,-1,-1,-1,-1,92,-1,83,84,85,86,87,8
B8,89,90,-1,-1,-1,-1,-1,-1,48,49,50,51,52,53,54,55,56,57,-1,-1,-1,-
C1,-1,-1/
DATA CTYPE /' '/
IF (ISTART.NE.0) GO TO 30
C INITIALIZE VARIABLES
IF ((LX.LE.LXM).AND.(LY.LE.LYM)) GO TO 10
WRITE (6,91) LXM, LYM, LX, LY
STOP 1
10 NPIX = 8/NBIT
LZ = (LX - 1)/NPIX + 1
LENB = LZ*LY
LENG = LENB + LZ
LZG = LZ + 1
BLANK = CHAR(0)
DO 20 J = 1, LENB
JMAGE(J) = BLANK
20 CONTINUE
ISTART = 1
C CHECK CODE
30 IF ((ICODE.LT.0).OR.(ICODE.GT.6)) GO TO 80
IF (ICODE.GT.0) GO TO 40
C CLEAR IMAGE
CALL ZIMAGE(G,BLANK,LX,LY)
GO TO 80
40 IF (ICODE.GT.5) GO TO 70
C PERFORM DRAW INSTRUCTION
IF (IC.EQ.ICC) GO TO 50
ICC = IC
ICT = IC - (IC/16)*16
IF ((NBIT.EQ.1).AND.(ICT.GT.0)) ICT = 1
IF (NBIT.EQ.2) ICT = ITWOBC(ICT+1)
IF (NBIT.GE.4) ICT = ICOLOR(ICT+1)
CTYPE = CHAR(ICT)
C FIRST PERFORM SCALING TO RASTER UNITS AND CLIP IF NECESSARY
50 I = (X - XMIN)*DX + .5
J = (Y - YMIN)*DY + .5
IF (I.LT.0) I = 0
IF (I.GT.LENX) I = LENX
IF (J.LT.0) J = 0
IF (J.GT.LENY) J = LENY
I = I + MINX
J = J + MINY
C PERFORM DRAW
IF (ICODE.EQ.5) GO TO 60
IF (ICODE.EQ.1) CALL DMOVE(I,J,ICX,ICY)
IF (ICODE.EQ.2) CALL DLINE(G,CTYPE,BLANK,LX,LY,I,J,ICX,ICY,LWTYPE)
IF (ICODE.EQ.3) CALL DPNT(G,CTYPE,BLANK,LX,LY,I,J,ICX,ICY,LWTYPE)
IF (ICODE.EQ.4) CALL DASHLN(G,CTYPE,BLANK,LX,LY,I,J,ICX,ICY,L,LWTY
1PE)
GO TO 80
60 ICT = IETA(ICHAR(C)+1)
CALL CDRAW(G,CTYPE,BLANK,LX,LY,ICT,I,J,ICX,ICY,CSX,CSY,LWTYPE)
GO TO 80
70 CALL GIMAGE (G,IMAGE,LX,LY,LZ,NBIT,INTRL)
CALL PCTSAV(IMAGE,JMAGE,IMG,LINE,LIMG,IXOR,LZ,LY,LENB,LENG,LZG,IFR
1MT,INTRL)
80 RETURN
END
*
*****************************************************
* COMPRG -- COMPRESSES RASTER IMAGE AND WRITES TO DISK
*****************************************************
*
SUBROUTINE COMPRG( G, NX, NY, NXV, inputbits, filter, irev )
C THIS SUBROUTINE COMPRESSES RASTER IMAGE AND WRITES RESULT TO DISK
C INPUT IS IN ARRAY G, AND OUTPUT IS WRITTEN TO DISK
C IF LX < NX OR LY < NY, THEN IMAGE IS TRUNCATED
C IF LX > NX OR LY > NY, THEN IMAGE IS PADDED WITH NULLS
C LX = NUMBER OF PIXELS IN X, LY = NUMBER OF PIXELS IN Y
C NBIT = NUMBER OF BITS PER PIXEL, NBIT < 9
PARAMETER(LXM=1024,LYM=781,NBITD=8)
PARAMETER(NPIXD=8/NBITD,LZM=(LXM-1)/NPIXD+1,LENBM=LZM*LYM)
PARAMETER(LENGM=LENBM+LZM,LZGM=LZM+1)
COMMON /GRDEV/ LX, LY, NBIT, IFRMT, INTRL, IXOR
CHARACTER*1 G(NXV,NY)
integer inputbits
integer filter
CHARACTER*1 BLANK
CHARACTER*1 IMAGE(LENBM), JMAGE(LENBM)
CHARACTER*1 IMG(LENGM), LINE(LZM), LIMG(LZGM)
SAVE ISTART,BLANK
SAVE LZ,LENB,LENG,LZG,JMAGE
91 FORMAT (24H SIZE ERROR, LXM, LYM = ,2I12,10H LX, LY = ,2I12)
DATA ISTART /0/
IF (ISTART.NE.0) GO TO 30
C INITIALIZE VARIABLES
IF ((LX.LE.LXM).AND.(LY.LE.LYM)) GO TO 10
WRITE (6,91) LXM, LYM, LX, LY
STOP 1
10 NPIX = 8/NBIT
LZ = (LX - 1)/NPIX + 1
LENB = LZ*LY
LENG = LENB + LZ
LZG = LZ + 1
BLANK = CHAR(0)
DO 20 J = 1, LENB
JMAGE(J) = BLANK
20 CONTINUE
ISTART = 1
* *****************************************************
* apply filter if needed
* there are 4 filters available:
* filter = 0 -- do not filter
* filter = 1 -- all non-background colors to white
* filter = 2 -- threshold
* filter = 3 -- dither
* there are 3 output formats available:
* nbit = 1 -- monocrome
* nbit = 2 -- 4 color
* nbit = 8 -- 256 color
* *****************************************************
30 continue
* *****************************************************
* if filtering not requested do nothing
* *****************************************************
if( filter .eq. 0 ) then
* *****************************************************
* if the number of bits in the output image is greate
* than or equal to those in the input image, do nothing
* *****************************************************
else if( nbit .ge. inputbits ) then
* *****************************************************
* filtering is all non-background colors to white
* *****************************************************
else if( filter .eq. 1 ) then
call towhite( g, nx, ny, inputbits )
* *****************************************************
* filtering is by threshold
* *****************************************************
else if( filter .eq. 2 ) then
if( nbit .eq. 1 ) then
call thrhld1( g, nx, ny, inputbits )
else if( nbit .eq. 2 ) then
call thrhld2( g, nx, ny )
else
end if
* *****************************************************
* filtering is by dither
* *****************************************************
else
if( nbit .eq. 1 ) then
if( inputbits .eq. 2 ) then
call dithr12( g, nx, ny )
else
call dithr18( g, nx, ny )
end if
else if( nbit .eq. 2 ) then
call dithr28( g, nx, ny )
else
end if
end if
* *****************************************************
* now compress and write out the image
* *****************************************************
CALL GRIMAGE (G,IMAGE,NX,NY,NXV,LX,LY,LZ,NBIT,INTRL,irev)
CALL PCTSAV(IMAGE,JMAGE,IMG,LINE,LIMG,IXOR,LZ,LY,LENB,LENG,LZG,IFR
1MT,INTRL)
RETURN
END
*
*****************************************************
* towhite -- turns all non-background colors to white
*****************************************************
*
subroutine towhite( g, nx, ny, inputbits )
COMMON /GRDEV/ LX, LY, NBIT, IFRMT, INTRL, IXOR
character*1 g(nx,ny)
* ********************************
* convert each byte in the g array
* ********************************
do 1 ix = 1,nx
do 2 iy = 1,ny
* *****************************************
* since we are only reducing the # of bits,
* then if the inputbits = 2, the output
* bits must = 1.
* if inputbits = 2, there are 4 input colors
* with 0 = background
* for bits = 1, 0 is background, 1 = the color
* ******************************************
if( inputbits .eq. 2 ) then
is = ichar( g( ix,iy ) )
g( ix,iy ) = char( is - (is/4)*4 )
if( g( ix,iy ) .ne. char( 0 ) )
. g( ix,iy ) = char( 1 )
* **************************************************
* if inputbits = 8, there are 256 input colors
* with 0 = background, all others are color
* if nbit is 1, the non-background color is 1
* if nbit is 2, the non-background color is 3
* **************************************************
else
if( nbit .eq. 1 ) then
if( g( ix,iy ) .ne. char( 0 ) )
. g( ix,iy ) = char( 1 )
else
if( g( ix,iy ) .ne. char( 0 ) )
. g( ix,iy ) = char( 3 )
end if
end if
2 continue
1 continue
return
end
*
*****************************************************
* thrhld1 -- threshold to 1 bit output
*****************************************************
*
subroutine thrhld1( g, nx, ny, inputbits )
character*1 g(nx,ny)
* **************************************************
* find the max and min values in g for 8 bit images
* **************************************************
if( inputbits .eq. 8 ) then
min = 255
max = 0
do 3 ix = 1,nx
do 4 iy = 1,ny
ival = ichar( g(ix,iy) )
if( ival .lt. min )
. min = ival
if( ival .gt. max )
. max = ival
4 continue
3 continue
idist = max - min + 1
ihalf = idist / 2
midpt = min + ihalf - 1
end if
* ********************************
* convert each byte in the g array
* ********************************
do 1 ix = 1,nx
do 2 iy = 1,ny
* *****************************************
* if inputbits = 2, convert 0 and 1 to 0
* and 2 and 3 to 1
* ******************************************
if( inputbits .eq. 2 ) then
* **************************************
* only except stuff in the low order 2
* bits of g
* ***************************************
is = ichar( g( ix,iy ) )
g( ix,iy ) = char( is - (is/4)*4 )
* **************************************
* now compare with the threshold
* ***************************************
if( g( ix,iy ) .le. char( 1 ) ) then
g( ix,iy ) = char( 0 )
else
g( ix,iy ) = char( 1 )
end if
* **************************************************
* if inputbits = 8, there are 256 input colors
* convert 0 - midpt to 0 and midpt - 255 to 1
* **************************************************
else
if( ichar( g(ix,iy) ) .le. midpt ) then
g( ix,iy ) = char( 0 )
else
g( ix,iy ) = char( 1 )
end if
end if
2 continue
1 continue
return
end
*
*****************************************************
* thrhld2 -- threshold to 2 bit output
* 2 bit output has the following colors:
* 0 = background
* 1 = magenta
* 2 = cyan
* 3 = white
*****************************************************
*
subroutine thrhld2( g, nx, ny )
character*1 g(nx,ny)
integer midpt( 3 )
* ***********************************************
* we can only be dealing with 8 bit input that
* we are taking down to 2 bit output
* ***********************************************
* **************************************************
* find the max and min values in g
* **************************************************
min = 255
max = 0
do 3 ix = 1,nx
do 4 iy = 1,ny
ival = ichar( g(ix,iy) )
if( ival .lt. min )
. min = ival
if( ival .gt. max )
. max = ival
4 continue
3 continue
idist = max - min + 1
ihalf = idist / 2
midpt( 2 ) = min + ihalf - 1
ihalf = idist / 4
midpt( 1 ) = min + ihalf - 1
midpt( 3 ) = midpt( 2 ) + ihalf - 1
* ********************************
* convert each byte in the g array
* ********************************
do 1 ix = 1,nx
do 2 iy = 1,ny
* **************************************************
* if inputbits = 8, there are 256 input colors
* convert 0 - 63 to 0, 64 - 127 to 1
* 128 - 191 to 2, 192 - 255 to 3
* **************************************************
if( ichar( g(ix,iy) ) .le. midpt( 1 ) ) then
g( ix,iy ) = char( 0 )
else if( ichar( g(ix,iy) ) .le. midpt( 2 ) ) then
g( ix,iy ) = char( 1 )
else if( ichar( g(ix,iy) ) .le. midpt( 3 ) ) then
g( ix,iy ) = char( 2 )
else
g( ix,iy ) = char( 3 )
end if
2 continue
1 continue
return
end
*
*****************************************************
* dithr12 -- dither a 2 bit input to a 1 bit output
*****************************************************
*
subroutine dithr12( g, nx, ny )
character*1 g( nx,ny )
integer d( 2,2 )
data d / 0, 2,
. 3, 1 /
* ********************************
* convert each byte in the g array
* ********************************
do 1 ix = 1,nx
ixd = mod( ix, 2 ) + 1
do 2 iy = 1,ny
iyd = mod( iy, 2 ) + 1
* **************************************
* only except stuff in the low order 2
* bits of g
* ***************************************
is = ichar( g( ix,iy ) )
g( ix,iy ) = char( is - (is/4)*4 )
* **************************************
* now compare with the dither threshold
* ***************************************
if( g( ix, iy ) .le. char( d( ixd,iyd ) ) ) then
g( ix, iy ) = char( 0 )
else
g( ix, iy ) = char( 1 )
end if
2 continue
1 continue
return
end
*
*****************************************************
* dithr18 -- dither an 8 bit input to a 1 bit output
*****************************************************
*
subroutine dithr18( g, nx, ny )
character*1 g( nx,ny )
integer d( 8,8 )
data d / 0, 32, 8, 40, 2, 34, 10, 42,
. 48, 16, 56, 24, 50, 18, 58, 26,
. 12, 44, 4, 36, 14, 46, 6, 38,
. 60, 28, 52, 20, 62, 30, 54, 22,
. 3, 35, 11, 43, 1, 33, 9, 41,
. 51, 19, 59, 27, 49, 17, 57, 25,
. 15, 47, 7, 39, 13, 45, 5, 37,
. 63, 31, 55, 23, 61, 29, 53, 21 /
* **************************************************
* find the max and min values in g
* **************************************************
min = 255
max = 0
do 3 ix = 1,nx
do 4 iy = 1,ny
ival = ichar( g(ix,iy) )
if( ival .lt. min )
. min = ival
if( ival .gt. max )
. max = ival
4 continue
3 continue
if( min .lt. 64 ) then
min = 0
else if( min .lt. 128 ) then
min = 64
else if( min .lt. 192 ) then
min = 128
else
min = 192
end if
if( max .lt. 63 ) then
max = 63
else if( max .lt. 127 ) then
max = 127
else if( max .lt. 191 ) then
max = 191
else
max = 255
end if
if( max - min .eq. 63 ) then
mfactor = 1
else if( max - min .eq. 127 ) then
mfactor = 2
else if( max - min .eq. 191 ) then
mfactor = 3
else
mfactor = 4
end if
* ********************************
* convert each byte in the g array
* ********************************
do 1 ix = 1,nx
ixd = mod( ix, 8 ) + 1
do 2 iy = 1,ny
iyd = mod( iy, 8 ) + 1
if( ichar( g(ix,iy) )
. .le.
. ( d(ixd,iyd) * mfactor ) + min ) then
g( ix, iy ) = char( 0 )
else
g( ix, iy ) = char( 1 )
end if
2 continue
1 continue
return
end
*
*****************************************************
* dithr28 -- dither an 8 bit input to a 2 bit output
*****************************************************
*
subroutine dithr28( g, nx, ny )
common /dithpal/ pal64, npal64
character*1 pal64( 3,256 )
character*1 g( nx,ny )
character*1 red( 1000,1000 )
character*1 green( 1000,1000 )
character*1 blue( 1000,1000 )
integer d( 8,8 )
data d / 0, 32, 8, 40, 2, 34, 10, 42,
. 48, 16, 56, 24, 50, 18, 58, 26,
. 12, 44, 4, 36, 14, 46, 6, 38,
. 60, 28, 52, 20, 62, 30, 54, 22,
. 3, 35, 11, 43, 1, 33, 9, 41,
. 51, 19, 59, 27, 49, 17, 57, 25,
. 15, 47, 7, 39, 13, 45, 5, 37,
. 63, 31, 55, 23, 61, 29, 53, 21 /
* ********************************************************
* if there is no palette present, use the default palette
* ********************************************************
if( npal64 .eq. 0 ) then
pal64( 1, 1 ) = char( 0 )
pal64( 2, 1 ) = char( 0 )
pal64( 3, 1 ) = char( 0 )
pal64( 1, 2 ) = char( 0 )
pal64( 2, 2 ) = char( 0 )
pal64( 3, 2 ) = char( 63 )
pal64( 1, 3 ) = char( 0 )
pal64( 2, 3 ) = char( 63 )
pal64( 3, 3 ) = char( 0 )
pal64( 1, 4 ) = char( 0 )
pal64( 2, 4 ) = char( 63 )
pal64( 3, 4 ) = char( 63 )
pal64( 1, 5 ) = char( 63 )
pal64( 2, 5 ) = char( 0 )
pal64( 3, 5 ) = char( 0 )
pal64( 1, 6 ) = char( 63 )
pal64( 2, 6 ) = char( 0 )
pal64( 3, 6 ) = char( 63 )
pal64( 1, 7 ) = char( 63 )
pal64( 2, 7 ) = char( 63 )
pal64( 3, 7 ) = char( 0 )
pal64( 1, 8 ) = char( 63 )
pal64( 2, 8 ) = char( 63 )
pal64( 3, 8 ) = char( 63 )
npal64 = 8
end if
* **************************************
* do this if the palet has > 4 entries
* **************************************
if( npal64 .gt. 4 ) then
* ***********************************************
* look up each pixel in the image on the palette
* and create a separate red, green, and blue image
* ***********************************************
do 1 ix = 1,nx
do 2 iy = 1,ny
ipalno = ichar( g( ix,iy ) ) + 1
if( ipalno .gt. npal64 ) then
red( ix,iy ) = char( 0 )
green( ix,iy ) = char( 0 )
blue( ix,iy ) = char( 0 )
else
red( ix,iy ) = pal64( 1, ipalno )
green( ix,iy ) = pal64( 2, ipalno )
blue( ix,iy ) = pal64( 3, ipalno )
end if
2 continue
1 continue
* ***********************************************
* dither the reds
* ***********************************************
do 11 ix = 1,nx
ixd = mod( ix, 8 ) + 1
do 12 iy = 1,ny
iyd = mod( iy, 8 ) + 1
if( red( ix, iy ) .le. char( d( ixd, iyd ) ) ) then
red( ix, iy ) = char( 0 )
else
red( ix, iy ) = char( 1 )
end if
12 continue
11 continue
* ***********************************************
* dither the greens
* ***********************************************
do 21 ix = 1,nx
ixd = mod( ix, 8 ) + 1
do 22 iy = 1,ny
iyd = mod( iy, 8 ) + 1
if( green( ix, iy ) .le. char( d( ixd, iyd ) ) ) then
green( ix, iy ) = char( 0 )
else
green( ix, iy ) = char( 1 )
end if
22 continue
21 continue
* ***********************************************
* dither the blues
* ***********************************************
do 31 ix = 1,nx
ixd = mod( ix, 8 ) + 1
do 32 iy = 1,ny
iyd = mod( iy, 8 ) + 1
if( blue( ix, iy ) .le. char( d( ixd, iyd ) ) ) then
blue( ix, iy ) = char( 0 )
else
blue( ix, iy ) = char( 1 )
end if
32 continue
31 continue
* ***********************************************
* combine the red, green, and blue images back
* into a single image using the following rules:
*
* red -> magenta = 1
* green -> cyan = 2
* blue -> cyan = 2
* red + green -> white = 3
* red + blue -> magenta = 1
* green + blue -> cyan = 2
* red + green + blue -> white = 3
* nothing -> background = 0
* ***********************************************
do 5 ix = 1,nx
do 6 iy = 1,ny
if( red( ix,iy ) .eq. char( 1 ) ) then
if( green( ix,iy ) .eq. char( 1 ) ) then
g( ix,iy ) = char( 3 )
else
g( ix,iy ) = char( 1 )
end if
else if( green( ix,iy ) .eq. char( 1 ) ) then
g( ix,iy ) = char( 2 )
else if( blue( ix,iy ) .eq. char( 1 ) )then
g( ix,iy ) = char( 2 )
else
g( ix,iy ) = char( 0 )
end if
6 continue
5 continue
* **************************************************
* if the palette has less then or equal to 4 entries
* just set any image pixel greater than 3 to 3
* **************************************************
else
do 8 ix = 1,nx
do 9 iy = 1,ny
if( g( ix,iy ) .gt. char( 3 ) )
. g( ix,iy ) = char( 3 )
9 continue
8 continue
end if
return
end
*
*****************************************************
* CINPUT
*****************************************************
*
SUBROUTINE CINPUT(C)
C DUMMY CHARACTER READ
CHARACTER*8 C
C = ' '
RETURN
END
*
*****************************************************
* QUITG -- TERMINATES COMPRESSED RASTER DEVICE
*****************************************************
*
SUBROUTINE QUITG
C THIS SUBROUTINE TERMINATES COMPRESSED RASTER DEVICE
COMMON /GRDEV/ LX, LY, NBIT, IFRMT, INTRL, IXOR
CHARACTER*1 BLANK
CHARACTER*1 CHR(4)
91 FORMAT (13H PROGRAM DONE)
BLANK = CHAR(0)
DO 10 I = 1, 4
CHR(I) = BLANK
10 CONTINUE
CALL BUFFWR(CHR,4,IFRMT)
CALL BUFFWR(CHR,0,IFRMT)
WRITE (6,91)
RETURN
END
*
*****************************************************
* VPARSE
*****************************************************
*
C PARSING LIBRARY FOR BEPS1
C COPYRIGHT 1990, REGENTS OF THE UNIVERSITY OF CALIFORNIA
C UPDATE: OCTOBER 16, 1990
SUBROUTINE VPARSE (CODE,ICODE,CP,IP,AP,INPUT,NC,NCC,NCI,NCR,IVAR,I
1RC)
C THIS SUBROUTINE PARSES INPUT STRING AND STORES APPROPRIATE VALUE INTO
C APPROPRIATE VARIABLE. THE VARIABLE NAMES (NC OF THEM) IN THE SYMBOL
C TABLE CODE MUST BE SIX CHARACTERS OR LESS IN LENGTH, AND CREATED IN
C ORDER OF TYPE CHARACTER*8 (NCC OF THEM), INTEGER (NCI OF THEM), AND
C REAL*4 (NCR OF THEM). INTEGER CODES CORRESPONDING TO THE CHARACTER
C TABLE MUST HAVE BEEN CALCULATED BY CALLS TO SUBROUTINE FINDCC:
C NC = NCC + NCI + NCR
C DO 10 I = 1, NC
C CALL FINDCC(CODE(I),ICODE(I),IC)
C 10 CONTINUE
C FIRST THE ENTRY IVAR IN THE TABLE ICODE IS IDENTIFIED (IRC=1 MEANS
C SYMBOL NOT FOUND). THEN THE NUMERICAL VALUE OF THE CHARACTERS TO THE
C RIGHT OF THE '=' SIGN IS FOUND (IRC=2 MEANS NO VALID VALUE FOUND), AND
C STORED IN CP, IP, OR AP AS APPROPRIATE FOR CHARACTER, INTEGER, OR REAL
C VARIABLES, RESPECTIVELY.
C CHARACTER*8 CP(NCC)
C DIMENSION IP(NCI), AP(NCR)
CHARACTER*(*) INPUT
CHARACTER*6 CODE(NC)
CHARACTER*8 CP(1)
DIMENSION ICODE(NC)
DIMENSION IP(1), AP(1)
91 FORMAT (1X,A6,3H = ,A8)
92 FORMAT (1X,A6,3H = ,I8)
93 FORMAT (1X,A6,3H = ,F14.7)
IM = LEN(INPUT)
IRC = 1
C FIND THE EQUAL SIGN
I = 1
10 IF (INPUT(I:I).EQ.'=') GO TO 20
I = I + 1
IF (I.LE.IM) GO TO 10
20 I = I - 1
C NO VARIABLE LEFT OF EQUAL SIGN
IF (I.LT.1) GO TO 80
C FIND NUMERICAL CODE FOR VARIABLE NAME
CALL FINDCC(INPUT(1:I),NUM,IC)
C INVALID CHARACTERS IN NAME
IF (IC.EQ.0) GO TO 80
C FIND VARIABLE NAME IN TABLE
J = 0
30 J = J + 1
IF (ICODE(J).EQ.NUM) GO TO 40
IF (J.LT.NC) GO TO 30
C VARIABLE NAME NOT FOUND IN TABLE
GO TO 80
40 IVAR = J
IRC = 2
IF (I.LT.(IM - 1)) GO TO 50
C NO VALUE RIGHT OF EQUAL SIGN
GO TO 80
C FIND VARIABLE TYPE
50 IF (J.GT.NCC) GO TO 60
C CHARACTER VARIABLE
CP(J) = INPUT(I+2:IM)
WRITE (6,91) CODE(J), CP(J)
IRC = 0
GO TO 80
C FIND VALUE
60 CALL EVALC(INPUT(I+2:IM),IVAL,VAL,ID)
C NOT A VALID NUMBER
IF (ID.EQ.0) GO TO 80
C VALID NUMBER
IRC = 0
NCT = NCC + NCI
IF (J.GT.NCT) GO TO 70
C INTEGER VARIABLE
IP(J-NCC) = IVAL
WRITE (6,92) CODE(J), IVAL
GO TO 80
C REAL VARIABLE
70 AP(J-NCT) = VAL
WRITE (6,93) CODE(J), VAL
80 RETURN
END
*
*****************************************************
* FINDCC
*****************************************************
*
SUBROUTINE FINDCC(CVAR,NUM,IC)
C THIS SUBROUTINE FINDS NUMERICAL CODE FOR VARIABLE NAME, WHICH CAN
C CONSIST OF LETTERS AND NUMBERS. UPPER AND LOWER CASE ARE TREATED AS
C EQUIVALENT, AND SPACES ARE IGNORED. IC IS NUMBER OF SYMBOLS FOUND IN
C VARIABLE NAME (IC = 0 IS RETURNED IF ILLEGAL CHARACTER IS FOUND).
C VARIABLE NAME MUST BE SIX CHARACTERS OR LESS IN LENGTH.
CHARACTER*1 V
CHARACTER*(*) CVAR
DIMENSION IETA(256)
DATA IB /36/
C ASCII CODES FOR EBCDIC 74,79,113,139,155 ARE NON-STANDARD
C EBCDIC CODES 28,30,106 ARE ADDED FOR IBM COMPATIBILITY
DATA IETA /0,1,2,3,-1,9,-1,127,-1,-1,-1,11,12,13,14,15,16,17,18,19
1,-1,-1,8,-1,24,25,-1,-1,28,29,30,31,-1,-1,28,-1,-1,10,23,27,-1,-1,
2-1,-1,-1,5,6,7,-1,-1,22,-1,-1,30,-1,4,-1,-1,-1,-1,20,21,-1,26,32,-
31,-1,-1,-1,-1,-1,-1,-1,-1,92,46,60,40,43,124,38,-1,-1,-1,-1,-1,-1,
4-1,-1,-1,33,36,42,41,59,94,45,47,-1,-1,-1,-1,-1,-1,-1,-1,124,44,37
5,95,62,63,-1,94,-1,-1,-1,-1,-1,-1,-1,96,58,35,64,39,61,34,-1,97,98
6,99,100,101,102,103,104,105,-1,123,-1,-1,-1,-1,-1,106,107,108,109,
7110,111,112,113,114,-1,125,-1,-1,-1,-1,-1,126,115,116,117,118,119,
8120,121,122,-1,-1,-1,91,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
9-1,93,-1,-1,123,65,66,67,68,69,70,71,72,73,-1,-1,-1,-1,-1,-1,125,7
A4,75,76,77,78,79,80,81,82,-1,-1,-1,-1,-1,-1,92,-1,83,84,85,86,87,8
B8,89,90,-1,-1,-1,-1,-1,-1,48,49,50,51,52,53,54,55,56,57,-1,-1,-1,-
C1,-1,-1/
IM = LEN(CVAR)
NUM = 0
IC = 0
I = 0
10 I = I + 1
IF ((I.GT.IM).OR.(IC.GE.6)) GO TO 60
V = CVAR(I:I)
IF (V.EQ.' ') GO TO 10
C IV = ICHAR(V) - 64
IV = IETA(ICHAR(V)+1) - 64
IF (IV.GT.26) GO TO 30
IF (IV.LT.1) GO TO 40
20 NUM = IV + IB*NUM
IC = IC + 1
GO TO 10
30 IV = IV - 32
IF ((IV.LT.1).OR.(IV.GT.26)) GO TO 50
GO TO 20
40 IV = IV + 17
IF ((IV.LT.1).OR.(IV.GT.10)) GO TO 50
IV = IV + 26
GO TO 20
50 IC = 0
60 RETURN
END
*
*****************************************************
* EVALC
*****************************************************
*
SUBROUTINE EVALC(CVAL,IVAL,VAL,ID)
C THIS SUBROUTINE EVALUATES NUMERICAL VALUE OF CHARACTER STRING.
C BOTH INTEGER, FLOATING POINT, AND E-FORMAT NUMBERS ARE ACCEPTED.
C FOR INTEGER, RETURNS BOTH INTEGER AND REAL VALUES.
C FOR FLOATING POINT, RETURNS BOTH REAL RESULT AND ITS INTEGER PART.
C FOR E-FORMAT, RETURNS REAL RESULTS AND INTEGER EXPONENT.
C ID IS THE NUMBER OF DIGITS FOUND. ILLEGAL CHARACTER TERMINATES
C EVALUATION.
CHARACTER*1 V
CHARACTER*(*) CVAL
DATA IB /10/
IS = ICHAR('0')
IM = LEN(CVAL)
NUM = 0
NORM = 1
IF = 0
IE = 0
ID = 0
I = 0
10 I = I + 1
IF (I.GT.IM) GO TO 60
V = CVAL(I:I)
20 IV = ICHAR(V) - IS
IF ((IV.LT.0).OR.(IV.GT.9)) GO TO 30
NUM = IV + IB*NUM
ID = ID + 1
IF (IF.EQ.1) NORM=IB*NORM
GO TO 10
30 IF ((V.EQ.' ').OR.(V.EQ.'+')) GO TO 10
IF (V.NE.'-') GO TO 40
NORM = -NORM
GO TO 10
40 IF (IE.EQ.1) GO TO 60
IF ((V.NE.'.').OR.(IF.EQ.1)) GO TO 50
IF = 1
GO TO 10
50 IF ((V.NE.'E').AND.(V.NE.'e')) GO TO 60
VAL = FLOAT(NUM)/FLOAT(NORM)
NUM = 0
NORM = 1
IE = 1
IF = 0
GO TO 10
60 IVAL = NUM/NORM
IF (IE.EQ.0) VAL = FLOAT(NUM)/FLOAT(NORM)
IF (IE.EQ.1) VAL = VAL*(10.**IVAL)
RETURN
END
*
*****************************************************
* CLEAR -- ERASES SCREEN FOR IBM TSO
*****************************************************
*
SUBROUTINE CLEAR
C ERASES SCREEN FOR IBM MVS/TSO
CHARACTER*5 LBL
DATA LBL /'CLEAR'/
C CALL IATTCH(LBL,5,IRC,ICMDRC)
RETURN
END
//NAMEGEN EXEC PLIX,PARM='OPT(0)'
//*
//* THIS PROGRAM ADDS NAME CARDS TO OBJECT MODULES SO THAT LOAD MODULES
//* WITH SEPERATE MEMBERS FOR EACH CSECT CAN BE CREATED. WRITTEN BY CST
/* OBJECT MODULE NAME CARD GENERATOR */
NAMEGEN: PROC OPTIONS (MAIN);
/* THIS PROGRAM GENERATES AND INSERTS LINKAGE EDITOR NAME CARDS
INTO A STREAM OF OBJECT MODULES GENERATED BY BATCHED COMPILATION.
THE STATEMENT 'GET_MODULE_NAME' MAY HAVE TO BE MODIFIED TO WORK
WITH OBJECT MODULES NOT CREATED BY THE FORTRAN COMPILERS. NOTE
THAT, WITH THE FORTRAN COMPILERS, THE OBJECT MODULES GENERATED BY
THE DECK OPTION AND WRITTEN TO SYSPUNCH CONTAIN SEQUENCE NUMBERS,
WHILE THE MODULES WRITTEN TO SYSLIN DO NOT. THEREFORE, THE DECK
OPTION IS RECOMMENDED. NOTE ALSO THAT NO ALIAS CARDS ARE
GENERATED. IF REQUIRED, ALIAS NAME CARDS MUST BE GENERATED BY
HAND. INPUT IS READ FROM DDNAME='INFILE', AND WRITTEN TO DDNAME=
'OUTFILE'.
*****
WRITTEN BY C. THOMAS -- 08/30/74 */
DCL
A CHAR (1),
B CHAR (3),
C CHAR (68),
D CHAR (4),
E FIXED BIN (31),
F CHAR (8),
K FIXED BIN (31) INIT (0);
ON ENDFILE (INFILE) GO TO DONE;
LOOP: GET SKIP FILE(INFILE) EDIT (A,B,C,D,E) (A(1), A(3), A(68),
A(4), F(4));
K = K + 1;
PUT SKIP FILE(OUTFILE) EDIT (A,B,C,D,E) (A(1), A(3), A(68),
A(4), P'9999');
GET_MODULE_NAME:IF K = 1 THEN F = SUBSTR (C,13,8);
IF B ^= 'END' THEN GO TO LOOP;
E = E + 1;
PUT SKIP FILE(OUTFILE) EDIT (' NAME ', F, D, E)
(A(7), A(8), COL(73), A(4), P'9999');
K = 0;
GO TO LOOP;
DONE: END NAMEGEN;
//GO.INFILE DD DISP=(SHR,PASS),DSN=*.COMPILE.FORT.SYSPUNCH
//GO.OUTFILE DD DISP=(NEW,PASS),DSN=&OBJOUT,UNIT=VIO,
// SPACE=(TRK,(50,50),RLSE),DCB=OBJECT
// EXEC FORTLG,PARM.LKED='NCAL,LET'
//LKED.SYSLIN DD DISP=(SHR,PASS),DSN=*.NAMEGEN.GO.OUTFILE
//LKED.SYSLMOD DD DISP=(NEW,CATLG),
// DSN=APP1.GRAPHICS.PCMOVIE,UNIT=___,
// SPACE=(TRK,(50,50),RLSE),DCB=OBJECT